我对 ViewPager + FragmentPageAdapter 有疑问。
场景: 我在 Fragment A 中有一个 Activity。Fragment A 有一个 ViewPager,其中有 Fragment B1 e Fragment B2。B1 e B2 是同一类,但作为参数的数据不同。
问题: 在创建时一切正常。但是当应用程序进入后台并且该进程被android杀死时,试图恢复上一个状态,再次启动应用程序时,Fragment B1 e B2 在前台不可见,而 Fragment A 是。看起来有点奇怪的是 Fragment B1 e B2 是在 Fragment A 的 ChildFragmentManager 中,并且因为 onStart() 和 onResume() 被调用(由 Log 看到)而被恢复。此外,寻呼机恢复了两页,但为空或更好,没有可见的内容。
如果我很好地理解 FragmentPagerAdapter 的工作原理,那么它应该负责管理自己的片段以及如何重新创建它们。此外,为了强制执行这一点,如果在该位置已经存在具有指定标记的片段,则从后台返回时,FragmentPagerAdapter 不会调用 getItem(int position)。
...那么为什么我看不到 Fragment B1 e B2,而只是寻呼机是空的?
这是我的示例代码。
片段A
@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;
}
}
片段 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();
}
}