android – 具有嵌套片段的ViewPager?

我的问题

根据谷歌的文档:

You can Now embed fragments inside fragments. This is useful for a
variety of situations in which you want to place dynamic and re-usable
UI components into a UI component that is itself dynamic and
re-usable. For example,if you use ViewPager to create fragments that
swipe left and right and consume a majority of the screen space,you
can Now insert fragments into each fragment page. To nest a fragment,
simply call getChildFragmentManager() on the Fragment in which you
want to add a fragment. This returns a FragmentManager that you can
use like you normally do from the top-level activity to create
fragment transactions. For example,here’s some code that adds a
fragment from within an existing Fragment class:

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment,videoFragment).commit();

所以我创建了自己的PageFragment.而我的PageFragmentAdapter包含3页PageFragment.
我还有六个片段:Fragment1,Fragment2,Fragment3,FragmentA,FragmentB,FragmentC.
在我的MainActivity中,我初始化了我的六个片段,我的ViewPager和它的PageFragmentAdapter(它自己初始化了三个PageFragment).

然后我使用这个方法将Fragment1,Fragment3附加到PageFragmentAdapter的每个页面(到每个PageFragment):

PageFragmentAdapter tPageFragmentAdapter = new PageFragmentAdapter(getSupportFragmentManager());
tPageFragmentAdapter.setFirstPage(tFragment1);
tPageFragmentAdapter.setSecondPage(tFragment2);
tPageFragmentAdapter.setThirdPage(tFragment3);

我可以(通过PageFragmentAdapter中的方法)重新获取片段并将“嵌套片段”放入我的PageFragment(当然在onCreate()中),如:

getChildFragmentManager().beginTransaction()
.add(R.id.framelayout_history,mFragment)
.addToBackStack(null)
.commit();

注意:我使用PageFragment.setnestedFragment()在其中设置mFragment.

而且效果很棒!
它将帮助我(但这个故事不是关于它)简单地替换ViewPager中的片段,如:

tPageFragmentAdapter.replaceFirstPage(tFragmentA);

我有一个很大的问题.
再次谷歌的文档:

Implementation of PagerAdapter that represents each page as a Fragment
that is persistently kept in the fragment manager as long as the user
can return to the page. This version of the pager is best for use when
there are a handful of typically more static fragments to be paged
through,such as a set of tabs. The fragment of each page the user
visits will be kept in memory,though its view hierarchy may be
destroyed when not visible. This can result in using a significant
amount of memory since fragment instances can hold on to an arbitrary
amount of state.

正如您所看到的,PageFragmentAdapter可以销毁我的每个PageFragment,当然还有它的嵌套片段.当它将被重新创建时,它将具有NULL而不是mFragment值.
我试图通过getChildFragmentManager().putFragment()保存它,然后通过getChildFragmentManager().getFragment()获取它.但它不起作用.

所以我的问题是:如何将我的嵌套片段保存在我的父片段中?可能吗?

我非常感谢你的帮助.亚历克斯.附:真的很抱歉我的英文:)

编辑

Thx @AndroidBegin.com的答案!

This seems to be a bug in the newly added support for nested
fragments. Basically,the child FragmentManager ends up with a broken
internal state when it is detached from the activity. A short-term
workaround that fixed it for me is to add the following to onDetach()
of every Fragment which you call getChildFragmentManager() on:

@Override
public void onDetach() {
    super.onDetach();

    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this,null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (illegalaccessexception e) {
        throw new RuntimeException(e);
    }
}

解决方法

在你的片段上尝试这个.
public class Fragment2 extends SherlockFragment {

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.viewpager_main,container,false);
        // Locate the ViewPager in viewpager_main.xml
        ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewPager);
        // Set the ViewPagerAdapter into ViewPager
        mViewPager.setAdapter(new ViewPagerAdapter(getChildFragmentManager()));
        return view;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        try {
            Field childFragmentManager = Fragment.class
                    .getDeclaredField("mChildFragmentManager");
            childFragmentManager.setAccessible(true);
            childFragmentManager.set(this,null);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (illegalaccessexception e) {
            throw new RuntimeException(e);
        }
    }
}

资料来源:http://www.androidbegin.com/tutorial/actionbarsherlock-side-menu-navigation-nested-viewpager-fragment-tabs-tutorial/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android岛屿数量算...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Andro...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android数据压缩的方法是什么”文章能帮助大家解决疑惑...
这篇“Android怎么使用Intent传大数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅...
本文小编为大家详细介绍“Android事件冲突怎么解决悬浮窗拖拽问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android事件冲突怎么解决悬浮窗拖拽问题”文...
这篇文章主要介绍了Android拼接如何实现动态对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android拼接如何实现动态对象文...
今天小编给大家分享一下Android全面屏适配怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下...
本篇内容介绍了“Android怎么开发Input系统触摸事件分发”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何...
今天小编给大家分享一下AndroidRoom怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下...
本文小编为大家详细介绍“AndroidRoom使用方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“AndroidRoom使用方法有哪些”文章能帮助大家...
这篇文章主要介绍“Android中的OpenGL怎么配置使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android中的Open...
这篇文章主要介绍了Android如何自定义自动识别涂鸦工具类的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android如何自定义自动...
今天小编给大家分享一下Android如何自定义有限制区域的图例角度自识别涂鸦工具类的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以...
今天小编给大家分享一下ReactNative错误采集原理在Android中如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章...
这篇文章主要讲解了“Android崩溃日志收集和保存代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“A...
这篇“Android面向单Activity开发实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大...
本篇内容介绍了“Android应用启动白屏处理的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何...