android - 第一次后未显示 Viewpager fragment

标签 android android-fragments android-viewpager

我有一个包含 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/

相关文章:

java - Google+ 喜欢 ViewPager 页面指示器

Android:如何在提供更准确的位置之前保持 GPS Activity ?

android - Android 6.0及以上系统如何7*24每10秒蜂鸣一次

java - 在 Firestore 中找不到文档数据,返回 null

android - findFragmentByTag() 在使用 replace() 方法执行 FragmentTransaction 后返回 null

android - 从 ListView 获取位置时,Viewpager 值不会改变

未调用 Android View onSaveInstanceState

Android Sliding Tabs 切断 Fragments 和 FAB 不工作

android - 如何在 Android 中为数据库编写可重用代码

android - Fragment BackStack 无法正常工作