我有一个包含 3 个 fragment (A、B、C)的 Activity 。 fragment A 由一个 ViewPager
和 2 个 ListFragments
组成。用户可以点击任何列表 fragment 中的项目,然后转到 fragment B。
在 fragment A 我做:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
pagerAdapter = new PagerAdapter(getActivity().getSupportFragmentManager());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragmentA, container, false);
vpPager = (ViewPager)view.findViewById(R.id.vpPager);
vpPager.setOffscreenPageLimit(2);
vpPager.setAdapter(pagerAdapter);
vpPager.addOnPageChangeListener(this);
return view;
}
而PagerAdapter
如下:
private class PagerAdapter extends FragmentPagerAdapter {
private final ListFragment1 lf1 = ListFragment1 .newInstance();
private final ListFragment2 lf2 = ListFragment2 .newInstance();
public PagerAdapter(android.support.v4.app.FragmentManager fm) {
super(fm);
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
switch (position) {
case 0: return lf1;
case 1: return lf2;
default: return null;
}
}
}
第一次显示 Activity 时,viewpager 列表 fragment 正确显示。
2 个 viewpager fragment 从数据库加载数据,我只执行一次(在创建 fragment 时)。
用户可以点击一个项目并显示 fragment B。如果用户按下返回,则显示 fragment A。但是列表 fragment 没有显示(它们的一个实例仍然存在)。
会不会是 View 已经被销毁了,即使实例存在?
这里有什么问题?有更好的方法吗?
编辑
如果我在寻呼机适配器中使用 newInstance
,我会得到 IllegalStateException: not attach to activity
。这是因为我按如下方式启动了一个异步任务:
@Override
public void onPageSelected(int position) {
Fragment fragment = pagerAdapter.getItem(position);
if (fragment instanceof IPagedFragment) {
((IPagedFragment) fragment).onShown();
}
}
而onShown
是:
@Override
public void onShown() {
myTask= new MyTask();
myTask.execute((Void)null);
}
我什么时候可以开始任务,以便我可以 100% 确定 fragment 已附加到 Activity 并且已创建 View (我需要从布局中获取 ListView 等)。
最佳答案
你必须像下面这样使用 ChildFragmentManager
。
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
pagerAdapter = new PagerAdapter(getChildFragmentManager()); //here used child fragment manager
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragmentA, container, false);
vpPager = (ViewPager)view.findViewById(R.id.vpPager);
vpPager.setOffscreenPageLimit(2);
vpPager.setAdapter(pagerAdapter);
vpPager.addOnPageChangeListener(this);
return view;
}
它在我的代码中使用 viewpager 和 fragment 就像魅力一样。
关于android - 第一次后未显示 Viewpager fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31607361/