Java 如何设计自动嵌套的片段类

Java 如何设计自动嵌套的片段类,java,android,android-fragments,android-nested-fragment,Java,Android,Android Fragments,Android Nested Fragment,我正在尝试这样做: public class MyFancyFragment<T> extends Fragment { ... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... getChildFragmentManager().beginTransaction()

我正在尝试这样做:

public class MyFancyFragment<T> extends Fragment { ... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... getChildFragmentManager().beginTransaction() .add(R.id.fancy_fragment_layout_id, new T(), "whatever") .commit(); ... } ... } 公共类MyFancyFragment扩展了片段{ ... @凌驾 CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){ ... getChildFragmentManager().beginTransaction() .add(R.id.fancy\u fragment\u layou\u id,new T(),“任意”) .commit(); ... } ... } 然后向MyFancyFragment类指定它应该使用的内部片段,例如

...new MyFancyFragment<FancyInnerFragmentType>()... …新的MyFancyFragment()。。。 但是Java当然不会让我创建一个新的t,因为泛型不是这样工作的

我这么做是有原因的。如果您以通常会受到诱惑的方式进行,即:

public class MyFancyFragment<T> extends Fragment { ... Fragment toShow; public void setFragment(Fragment toShow) { this.toShow = toShow; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... getChildFragmentManager().beginTransaction() .add(R.id.fancy_fragment_layout_id, toShow, "whatever") .commit(); ... } ... } 公共类MyFancyFragment扩展了片段{ ... 碎片托肖; 公共void setFragment(Fragment toShow){ this.toShow=toShow; } @凌驾 CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){ ... getChildFragmentManager().beginTransaction() .add(R.id.fancy\u fragment\u layou\u id,toShow,“随便什么”) .commit(); ... } ... } 一开始你会很好,但问题归结到Android片段架构。如果在片段backbackback上使用MyFancyFragment,android可以随时销毁该片段,然后通过其公共空构造函数重新创建它。当它这样做时,它不会知道如何为您调用setFragment()。我可以按照ViewPager的设计路线,设置一个适配器,根据需要生成片段;但我现在真的对ViewPager感到困惑-如果ViewPager片段被销毁并通过backbackback操作重新创建,它不会忘记它的适配器吗

我还想,当我第一次创建MyFancyFragment时,也许我可以使用一个片段类型(因此,将一个类而不是片段传递给上面的setFragment()),在onCreateView()中动态使用它创建一个实例,并尝试在onSaveInstanceState()中将该类类型封送到我的包中,以备以后需要onCreateView()时使用再说一遍:但我不知道如何在Bundle中存储这样的非基本类型?我可以设置一个primitivetype实例映射,但随后我失去了编译器支持,无法确保有人在创建新实例时更新该映射;如果你想使用的新实例是匿名类,你就完蛋了

这样做的唯一方法似乎是声明MyFancyFragment抽象并创建匿名内部类来扩展它,以返回目标内部片段(类似于许多涉及DialogFragment及其onCreateView()的常见示例);但是,如果筑巢的层次变得非常深,这会变得非常棘手:(.在我目前的情况下,我有一个DialogFragment,其中包含一个a,其中包含一个B,其中包含一个MyFancyFragment,如果我开始需要动态子类化,我必须对DialogFragment、a、B和MyFrancyFragment中的每一个进行子类化,以使其工作,对于我想要显示的每个弹出窗口(有几个).对于泛型,我想我可以声明一个A(),然后就可以了,T会慢慢下降;但是我不知道怎么做或者类似的事情

我们该怎么做