第二次查看时,使用FragmentPagerAdapter的ViewPager中的片段为空白
我有一个片段界面,底部有标签,在主视图中打开不同的片段。
我有一个特定的片段,这是一个项目列表。 如果用户select这个列表中的一个项目,则打开另一个片段,其包含在前一个片段中的列表中的所有项目之间水平滚动的viewpager。 这很好。
viewpager使用FragmentPagerAdapter来显示项目。
当用户select列表中的项目,查看它,然后点击标签栏上的button返回到列表,然后select另一个项目时,问题出现了。 第二次select一个项目时,会出现一个空白屏幕而不是viewpager。 发生这种情况时,我在LogCat中没有收到任何错误。
为什么viewpager第一次出现?
FragmentPagerAdapter:
public class ViewPagerAdapter extends FragmentPagerAdapter { Cursor mCursor; public ViewPagerAdapter(FragmentManager fm, Cursor c) { super(fm); mCursor = c; } public void changeCursor(Cursor c) { mCursor = c; this.notifyDataSetChanged(); } @Override public int getCount() { if (mCursor == null) return 0; else return mCursor.getCount(); } @Override public Fragment getItem(int position) { mCursor.moveToPosition(position); return TeamCardFragment.newInstance(mCursor, position); } }
PagerFragment:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Bundle bundle = getArguments(); mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION); View mView = inflater.inflate(R.layout.team_card_master, container, false); mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager); mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor); new setAdapterTask().execute(); return mView; } private class setAdapterTask extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... params) { return null; } @Override protected void onPostExecute(Void result) { mViewPager.setAdapter(mAdapter); mViewPager.setCurrentItem(mCursorPosition); } }
我遇到过同样的问题。 我的PageAdapter的父类从android.support.v4.app.FragmentPagerAdapter
更改为android.support.v4.app.FragmentStatePagerAdapter
解决我的ViewPager
显示问题“第二次”!
我设法通过在父代片段中用getChildFragmentManager()
replacegetFragmentManager()
来解决这个问题。 这个父级片段实例化了一个android.support.v4.app.FragmentPagerAdapter以便包含可分页(可滑动)的片段,这需要构造器中的一个片段pipe理器。 我给这个构造函数传递了getChildFragmentManager()
的返回值。
hackbod的链接是关键( https://developer.android.com/about/versions/android-4.2.html#NestedFragments ),这是发现在这篇文章片段内碎片
在我特别的情况下,我使用的是一个AppBarLayout和ViewPager的CoordinatorLayout,我解决它是从我的AppBarLayout xml属性中删除android:fitsSystemWindows =“true” 。
不要问我为什么。 我知道这听起来有点荒谬,就像它应该没有关联,但这是唯一的麻烦,因为我已经在我的适配器中使用getChildFragmentManager()。 我花了一整天的时间来debugging我的代码,只是为了find它,所以我希望它能够节省一些时间。
对我来说,我不得不在我的viewpager上调用这个:
myViewPager.setSaveFromParentEnabled(false);
我有问题viewpager不刷新,我只看到一个空白的白色屏幕应该是碎片。 我在传递getChildFragmentManager但它没有帮助。
我们通过重新实现视图寻呼机项目作为标准视图,而不是片段,并相应地更改适配器来解决这个问题。
我有同样的问题,我把适配器从FragmentPagerAdapter
更改为FragmentStatePagerAdapter
和getFragmentManager()
在父片段getChildFragmentManager()
。
这个背后的原因是FragmentStatePagerAdapter
有助于存储大量页面,并且与每个访问的页面相关的内存更less,因为它只保留片段的保存状态,而页面不可见。 这减less了片段之间切换时的开销。
您还可以初始化适配器,以便在应用程序被最小化并稍后调用时遇到此错误。
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Bundle bundle = getArguments(); mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION); View mView = inflater.inflate(R.layout.team_card_master, container, false); mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager); initViewPagerAdapter(); return mView; } private void initViewPagerAdapter(){ mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor); new setAdapterTask().execute(); } @Override public void onResume(){ super.onResume(); initViewPagerAdapter(); }
我第二次在Xamarin Android上得到了一个空白的屏幕上的同样的问题..设置以下固定它给我…
viewPager.SaveFromParentEnabled = false;
我有同样的事情,在我第二次调用寻呼机适配器,子视图返回一个NullPointerException。 而改变FragmentStatePagerAdapter中的适配器也解决了我的问题。