我有一个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 回答
使用FragmentStatePagerAdapter而不是FragmentPagerAdapter . 它对我有用 . 但如果您的ViewPager有很多要显示的视图,则会出现内存问题(仅在屏幕方向更改时) .
这是我的PagerDadapter有标签,也许它可以帮助你一点: