【问题标题】:ViewPager setOffscreenPageLimit not working when using it as NestedFragment with getChildFragmentManager将 ViewPager setOffscreenPageLimit 用作带有 getChildFragmentManager 的 NestedFragment 时不起作用
【发布时间】:2015-12-30 08:25:46
【问题描述】:

我正在尝试做类似于https://stackoverflow.com/a/24437224/2277631 的事情。我什至使用相同的布局:

我之所以采用这种方法,是因为我使用的是 NavigationView(每个选项都是一个片段),它的第一个选项是带有选项卡的片段(因此是带有更多片段的 ViewPager)。

使用时发现问题:

viewPager.setAdapter(new AdapterView(getChildFragmentManager()));

基本上,使用 ViewPager 作为嵌套片段,它仅加载 1 个页面(来自 3 个选项卡),并且仅在我滑动到其他页面时加载其他页面(每个选项卡都是带有其 ContentLoader 的片段)。我发现在这种情况下使用 setOffscreenPageLimitgets 会被忽略。相反,如果我使用: getActivity().getSupportFragmentManager() 然后 ViewPager 按预期工作(默认加载 1 页以及下一页和上一页)。但是随后发生了很多奇怪的事情(因为我想在使用嵌套片段时使用getChildFragmentManager)。所以...有什么想法可以使用 ViewPager 作为嵌套片段并使setOffscreenPageLimit 工作?

编辑 1(2015 年 12 月 30 日)

跟踪错误,我检查了所有片段是否都已创建。问题是三个片段都有自己的LoaderCallback,但只有第一个片段调用onLoadFinished。试图弄清楚为什么其他片段在导航到它时只调用onLoadFinished(在没有嵌套方法的情况下工作)。

【问题讨论】:

    标签: android android-fragments android-viewpager android-nested-fragment


    【解决方案1】:

    我遇到了同样的问题。我就是这样做的,这对我有用,它与您期望的架构相同。

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            super.onSaveInstanceState(savedInstanceState);
            view = inflater.inflate(R.layout.communitylayout, container, false);
            Bundle data = getArguments();
    
            TabLayout tabLayout = (TabLayout) view.findViewById(R.id.comtabs);
            tabLayout.setTabMode(TabLayout.MODE_FIXED);
    
    
            // add tabs
            tabLayout.addTab(tabLayout.newTab());
            tabLayout.addTab(tabLayout.newTab());
            tabLayout.addTab(tabLayout.newTab());
    
            RelativeLayout layout1 = (RelativeLayout) inflater.inflate(R.layout.communitytablayoutleft, container, false);
            RelativeLayout layout2 = (RelativeLayout) inflater.inflate(R.layout.communitytablayout, container, false);
            RelativeLayout layout3 = (RelativeLayout) inflater.inflate(R.layout.communitytablayoutright, container, false);
            tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    
    
    
            pager = (ViewPager) view.findViewById(R.id.compager);
            CommunityPagerFragment adapter = new CommunityPagerFragment(getChildFragmentManager());
    
            pager.setAdapter(adapter);
            tabLayout.setupWithViewPager(pager);
            pager.setCurrentItem(0);
            tabLayout.setOnTabSelectedListener(this);
    
            // KEEP FRAGMENT STATE INSIDE OF THE TAB
            pager.setOffscreenPageLimit(2);
    
    
            ((TextView)layout1.findViewById(R.id.tabtext)).setText(tabs[0]);
            ((TextView)layout2.findViewById(R.id.tabtext)).setText(tabs[1]);
            ((TextView)layout3.findViewById(R.id.tabtext)).setText(tabs[2]);
    
            //tabLayout.set
    
    
            tabLayout.getTabAt(0).setCustomView(layout1);
            tabLayout.getTabAt(1).setCustomView(layout2);
            tabLayout.getTabAt(2).setCustomView(layout3);
    
            onTabSelected(tabLayout.getTabAt(1));
            //tabLayout.set
    
            return view;
    

    如果除了滑动之外,您还想通过单击使选项卡工作,请添加以下内容:

    @Override
    public void onTabSelected(TabLayout.Tab tab) {
    
        pager.setCurrentItem(tab.getPosition());
    
    }
    

    【讨论】:

    • 嗯,所以你只是建议不要在这种情况下使用嵌套片段?我有 3 个片段,我在其中发送一个包,并根据这些参数使用 ContentLoader 加载一些东西。我不确定您的解决方案是否会有所帮助。我想我不会使用嵌套片段,将 ViewPager 放在主要活动中并根据所选选项隐藏/显示它:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多