保持状态viewpager Android的碎片 [英] retain state of viewpager fragments android

查看:124
本文介绍了保持状态viewpager Android的碎片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在其中我显示3个片段片段的viewpager但是当我打开片段第一次打开罚款,当我移动到另一个片段回来给viewpager片段它并不显示在片段查看传呼机那么我不得不要么更改手机的方向或保持刷卡viewpager的隐藏片段显示。

我GOOGLE了它,现在我知道我必须将标签设置为每个片段并用findfragmentbytag方法来检索片段,但问题是,当我尝试设置标签片段

  getSupportFragmentManager()调用BeginTransaction()加(myFragment,一些代码),提交()。;

上面一行崩溃我的应用程序和logcat的显示着一组标签片段,我知道我在做一些愚蠢的错误

这是我的片段的完整code。我真的AP preciate如果一个人可以指导我在哪里写的code设置片段的标签。先谢谢了。

 公共类MatchesListingFragment扩展片段实现ActionBar.TabListener {    上下文语境;
    SectionsPagerAdapter mSectionsPagerAdapter;
    ViewPager mViewPager;
    动作条动作条;
    Matchlistings分贝;
    捆绑savedInstanceState;    片段比分,夹具,结果;    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        // TODO自动生成方法存根
        super.onCreate(savedInstanceState);        this.savedInstanceState = savedInstanceState;
        DB =新Matchlistings(getActivity());
    }    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
        捆绑savedInstanceState){
        返回inflater.inflate(R.layout.fragment_matches,集装箱,FALSE);
    }    @覆盖
    公共无效onActivityCreated(捆绑savedInstanceState){
        super.onActivityCreated(savedInstanceState);
        上下文= getActivity()getApplicationContext()。        如果(savedInstanceState == NULL){
            比分=新LiveScoreListingFragment();
            夹具=新FixturesListingFragment();
            结果=新ResultsListingFragment();
        }        如果(!Constants.is_listing_refreshed){
            Log.i(MainActivity.TAG,提神名单);
            。db.loadListingsFromServer()executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }        动作条= getActivity()getActionBar()。
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        如果(mSectionsPagerAdapter == NULL)
        mSectionsPagerAdapter =新SectionsPagerAdapter(getActivity()getSupportFragmentManager());
        mViewPager =(ViewPager)getView()findViewById(R.id.pager)。
        mViewPager.setAdapter(mSectionsPagerAdapter);        mViewPager.setOnPageChangeListener(新ViewPager.SimpleOnPageChangeListener(){
            @覆盖
            公共无效使用onPageSelected(INT位置){
                actionBar.setSelectedNavigationItem(位置);
            }
        });
        的for(int i = 0; I< mSectionsPagerAdapter.getCount();我++){
            标签TB = actionBar.newTab()
            .setText(mSectionsPagerAdapter.getPageTitle(I))
            .setTabListener(本);            actionBar.addTab(TB);        }
    }    公共类SectionsPagerAdapter扩展FragmentPagerAdapter {
        片段片段;        公共SectionsPagerAdapter(FragmentManager FM){
            超(FM);
        }        @覆盖
        公共片段的getItem(INT位置){
            开关(位置){
            情况下0:                片段=比分;
                返回片段;
            情况1:
                片段=夹具;
                返回片段;
            案例2:
                片段=结果;
                返回片段;
            案例3:
                片段=新LiveScoreListingFragment();
                返回片段;
            }
            返回null;
        }        @覆盖
        公众诠释的getCount(){
            返回4;
        }        @覆盖
        公共CharSequence的getPageTitle(INT位置){
            开关(位置){
            情况下0:
                返回活;
            情况1:
                返回兴业;
            案例2:
                返回结果;
            案例3:
                返回热;
            }
            返回null;
        }
    }    @覆盖
    公共无效的onDestroy(){
        // TODO自动生成方法存根
        super.onDestroy();
        actionBar.removeAllTabs();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    }    @覆盖
    公共无效onTabReselected(标签为arg0,ARG1 FragmentTransaction){
        // TODO自动生成方法存根    }    @覆盖
    公共无效onTabSelected(标签为arg0,ARG1 FragmentTransaction){
        // TODO自动生成方法存根    }    @覆盖
    公共无效onTabUnselected(标签为arg0,ARG1 FragmentTransaction){
        // TODO自动生成方法存根    }}

编辑:
现在我已经试图通过标签来获得viewpager的片段,而不是创造新的片段,每次的。但问题还是一样的。

  FixturesListingFragment夹具=(FixturesListingFragment)getActivity()getSupportFragmentManager()findFragmentByTag(机器人:切换:+ R.id.pager +1)。;
                如果(夹具== NULL)
                    夹具=新FixturesListingFragment();


解决方案

你有没有试过用 setOffscreenPageLimit ?如果你有3页,然后将其设置为2,这样的页面将不会重新创建,即使应用程序是iddle状态。这里是<一个href=\"http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit%28int%29\">link

I have a viewpager in a fragment in which i am showing 3 fragments but when I open the fragment first time it opens fine and when I move to another fragment and came back to the viewpager fragment it doesn't show the fragments in view pager then I have to either change the orientation of the phone or keep swiping the viewpager for the hidden fragments to show.

I have googled it and now I know I have to set the tag to each fragment and retrieve fragment with findfragmentbytag method but problem is when I try to set the tag to fragment

getSupportFragmentManager().beginTransaction().add(myFragment, "Some Tag").commit();

above line crashes my app and logcat shows "cant set tag to fragment", I know I'm doing some stupid mistake

this is the complete code of my fragment. I would really appreciate if one could guide me where to write the code for setting the tag of fragments. thanks in advance.

public class MatchesListingFragment extends Fragment implements ActionBar.TabListener {

    Context context;
    SectionsPagerAdapter mSectionsPagerAdapter;
    ViewPager mViewPager;
    ActionBar actionBar;
    Matchlistings db;
    Bundle savedInstanceState;

    Fragment livescore,fixture,results;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        this.savedInstanceState = savedInstanceState;
        db = new Matchlistings(getActivity());
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_matches, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        context = getActivity().getApplicationContext();

        if(savedInstanceState == null){
            livescore = new LiveScoreListingFragment();
            fixture = new FixturesListingFragment();
            results = new ResultsListingFragment();
        }

        if(!Constants.is_listing_refreshed){
            Log.i(MainActivity.TAG,"refreshing list");
            db.loadListingsFromServer().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }

        actionBar = getActivity().getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        if(mSectionsPagerAdapter == null)
        mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());
        mViewPager = (ViewPager) getView().findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }
        });


        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
            Tab tb = actionBar.newTab()
            .setText(mSectionsPagerAdapter.getPageTitle(i))
            .setTabListener(this);

            actionBar.addTab(tb);

        }
    }

    public class SectionsPagerAdapter extends FragmentPagerAdapter {
        Fragment fragment;

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch(position){
            case 0:

                fragment = livescore;
                return fragment;
            case 1:
                fragment = fixture;
                return fragment;
            case 2:
                fragment = results;
                return fragment;
            case 3:
                fragment = new LiveScoreListingFragment();
                return fragment;
            }
            return null;
        }

        @Override
        public int getCount() {
            return 4;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
            case 0:
                return "LIVE";
            case 1:
                return "FIXTURES";
            case 2:
                return "RESULTS";
            case 3:
                return "HOT";
            }
            return null;
        }
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        actionBar.removeAllTabs();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    }

    @Override
    public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
        // TODO Auto-generated method stub

    }

}

EDIT: i have now tried to get the fragment from viewpager by tag instead of creating new fragment everytime. but problem is still same.

FixturesListingFragment fixture = (FixturesListingFragment) getActivity().getSupportFragmentManager().findFragmentByTag("android:switcher:"+R.id.pager+":1");
                if(fixture == null)
                    fixture = new FixturesListingFragment();

解决方案

Have you tried to use setOffscreenPageLimit? if you have 3 pages then set it to 2. This way pages won't be recreated even if the app is on iddle state. Here is the link

这篇关于保持状态viewpager Android的碎片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆