【问题标题】:How can i Force a ViewPager to make their Fragments to be recreated?我如何强制 ViewPager 重新创建他们的片段?
【发布时间】:2017-01-31 13:00:29
【问题描述】:

场景:

我有一个带有ViewPager 的片段,它有一个提供 3 个片段的FragmentPagerAdapter

所以我的应用程序第一次加载时,3 个标签片段看起来还不错。

当我在应用程序中导航时,我会执行 FragmentManager.replace 来加载另一个片段。

当我返回或导航到主视图(选项卡式视图)时,我的第一个和第二个选项卡是空白的。

我调试了应用程序,Fragment.onDestroyView 永远不会在 Tab 片段上被调用,所以当它再次显示时,Fragment.onCreateView 永远不会再次被调用,所以我的视图是空白的。

如果我导航到选项卡式片段中的第三个选项卡,则 Fragment.onDestroy 会被 PageAdapter 调用(我认为是因为 ViewPager 上的 1 offLimit)

所以,我的问题是,一旦我的 Activity 中加载了另一个 Fragment,然后我返回或导航到选项卡式视图,我该如何强制使用 ViewPager,或 PageAdapter,甚至是 Fragment自己被重新创建。

到目前为止,我尝试用 TabView 做一个 FragmentManager.remove(fragment) 没有任何外观,而且,每次,我导航到选项卡视图我将一个新实例传递给 FragmentManager.replace 方法,似乎每次,他从FragmentManager 中提取相同的对象。

标签视图(片段):

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.tab_view, container, false);
    viewPager = (ViewPager) view.findViewById(R.id.view_iam);
    final PagerAdapter pagerAdapter = new MyFragmentAdapter(getActivity().getSupportFragmentManager());
    viewPager.setAdapter(pagerAdapter);
    return view;
}

页面适配器:

private static class MyFragmentAdapter extends FragmentPagerAdapter {
    private Fragment[] tabs;
    private String[] names;

    public MyFragmentAdapter(FragmentManager fm) {
        super(fm);
        tabs = new Fragment[]{new FlightsView(), new MyFlightsRequestView(),
                new MyFlightsView()};
        names = new String[]{"VUELOS", "SOLICITUDES", "MIS VUELOS"};
    }

    @Override
    public Fragment getItem(int position) {
        return tabs[position];
    }

    @Override
    public int getCount() {
        return tabs.length;
    }

    @Override
    public String getPageTitle(int position) {
        return names[position];
    }

}

FlightsView(标签片段之一)

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.view_flight, container, false);
    recycle_view = (RecyclerView) view.findViewById(R.id.recycler_view);
    progressBar = (ProgressBar) view.findViewById(R.id.progress_bar);

    setHasOptionsMenu(true);
    return view;
}

【问题讨论】:

    标签: android android-layout android-fragments android-viewpager


    【解决方案1】:

    您能否尝试从 FragmentStatePagerAdapter 而不是 FragmentPagerAdapter

    扩展您的适配器

    【讨论】:

    • 不走运,是同样的行为
    • 如何使用 getChildFragmentManager() 而不是 getSupportFragmentManager()
    • 如果有效,则可以将其标记为答案,以便其他人找到解决方案
    • 我该怎么做,我看到的唯一选项是举报滥用或类似情况的 FLAG,以及一个箭头(已经点击它)
    • 向下箭头下方必须有一个勾号按钮。如果你按下它,这意味着它已经解决了你的问题。
    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2013-05-08
    相关资源
    最近更新 更多