首页 文章

ViewPager片段娱乐,恢复但不可见

提问于
浏览
11

我有一个ViewPager FragmentPageAdapter的问题 .

Scenario: 我在片段A中有一个活动 . 片段A有一个带有片段B1和片段B2的ViewPager . B1 e B2是相同的类,但不同的数据作为参数 .

Problem: 创作时一切都很好 . 但当应用程序进入后台并且进程被android杀死时,尝试恢复最后一个状态,再次启动应用程序,Fragment B1 e B2不会't visible in foreground, while Fragment A is. What seems a bit strange is that Fragment B1 e B2 are int the Fragment A'的ChildFragmentManager并且由于onStart()和onResume()被调用而被恢复(见日志) . 此外,寻呼机恢复两页,但空或更好,没有任何可见 .

如果我很清楚FragmentPagerAdapter是如何工作的,那么它应该负责管理自己的片段以及如何重新创建片段 . 此外,为了强制执行这一点,如果已经存在具有指定标记的该位置的片段,则FragmentPagerAdapter在从后台返回时不会调用getItem(int position) .

...那么为什么我看不到片段B1 e B2,只有传呼机空了?

这是我的示例代码 .

FragmentA

@Override
    public void onStart() {
        super.onStart();
        populateViewPager();
    }

    private void populateViewPager() {
        pager.setAdapter(new MyFragmentPageAdapter(getChildFragmentManager()));
        indicator.setViewPager(pager);
        indicator.notifyDataSetChanged();
    }

FragmentPagerAdapter

public class MyFragmentPageAdapter extends FragmentPagerAdapter {


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

    @Override
    public Fragment getItem(int position) {
        return FragmentB.newInstance(position);
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        String title = "";
        if (position == 0)
            title = "Fragment B1";
        else if (position == 1)
            title = "Fragment B2";

        return title;
    }
}

Fragment B

public static FragmentB newInstance(int position) {
                FragmentB f = new FragmentB();
                Bundle b = new Bundle();
                b.putInt(POSITION_IN_PAGER_ARGUMENT, position);
                f.setArguments(b);
                return f;
            }

            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                Log.d(TAG, "onCreate");
            }

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                super.onCreateView(inflater, container, savedInstanceState);
                Log.d(TAG, "onCreateView");
                View root = inflater.inflate(R.layout.fragment_b_layout, container, false);

                empty = (TextView) root.findViewById(R.id.empty);
                list = (ListView) root.findViewById(R.id.list);

                return root;
            }

            @Override
            public void onStart() {
                super.onStart();
                Log.d(TAG, "onStart");
                populateListView(loadData());

            }

            @Override
            public void onStop() {
                super.onStop();
            }
    }

2 回答

  • 0

    使用FragmentStatePagerAdapter而不是FragmentPagerAdapter . 它对我有用 . 但如果您的ViewPager有很多要显示的视图,则会出现内存问题(仅在屏幕方向更改时) .

  • 7

    这是我的PagerDadapter有标签,也许它可以帮助你一点:

    public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
            private final Context               mContext;
            private final ActionBar             mActionBar;
            private final ViewPager             mViewPager;
            private final ArrayList<TabInfo>    mTabs   = new ArrayList<TabInfo>();
    
            static final class TabInfo {
                private final Class<?>  clss;
                private final Bundle    args;
    
                TabInfo(Class<?> _class, Bundle _args) {
    
                    clss = _class;
                    args = _args;
                }
            }
    
            public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
    
                super(activity.getSupportFragmentManager());
                mContext = activity;
                mActionBar = activity.getSupportActionBar();
                mViewPager = pager;
                mViewPager.setAdapter(this);
                mViewPager.setOnPageChangeListener(this);
            }
    
            /**
             * methode qui construit un onglet
             * 
             * @param tab
             * @param clss
             * @param args
             */
            public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
    
                TabInfo info = new TabInfo(clss, args);
                tab.setTag(info);
                tab.setTabListener(this);
                mTabs.add(info);
                mActionBar.addTab(tab);
                notifyDataSetChanged();
            }
    
            @Override
            public int getCount() {
    
                return mTabs.size();
            }
    
            @Override
            public Fragment getItem(int position) {
    
                TabInfo info = mTabs.get(position);
                return Fragment.instantiate(mContext, info.clss.getName(), info.args);
            }
    
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
            }
    
            public void onPageSelected(int position) {
    
                mActionBar.setSelectedNavigationItem(position);
                ((SherlockFragmentActivity) mContext).supportInvalidateOptionsMenu();
            }
    
            public void onPageScrollStateChanged(int state) {
    
            }
    
            public void onTabSelected(Tab tab, FragmentTransaction ft) {
    
                //
                // force l'appel de onOptionMenuPrepared
                ((SherlockFragmentActivity) mContext).supportInvalidateOptionsMenu();
                Object tag = tab.getTag();
                for (int i = 0; i < mTabs.size(); i++) {
                    if (mTabs.get(i) == tag) {
                        mViewPager.setCurrentItem(i);
                    }
                }
            }
    
            public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    
            }
    
            public void onTabReselected(Tab tab, FragmentTransaction ft) {
    
            }
        }
    

相关问题