我正在尝试做这样的事情:

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类中指定它应该使用哪个内部Fragment,例如:

...new MyFancyFragment<FancyInnerFragmentType>()...

但是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();
    ...
    }
...
}

一开始你会没事的,但问题归结为Android Fragment架构 . 如果你在片段backstack上使用MyFancyFragment,android可以在任何时候破坏Fragment,然后通过它的公共空构造函数重新创建它 . 当它这样做时,它不会知道为你调用setFragment() . 我可以去ViewPager设计路线并设置一个适配器来按需生成片段;但我现在真的对ViewPager感到困惑 - 如果ViewPager片段被销毁并通过Backstack操作重新创建,它会不会忘记它的适配器?

我还想也许我可以在第一次创建MyFancyFragment时使用Fragment类型(所以将一个Class而不是Fragment传递给上面的setFragment()),在onCreateView()中动态创建一个实例,然后尝试编组如果我需要再次使用onCreateView(),那么在onSaveInstanceState()中将该类类型添加到我的包中:但我不知道如何在Bundle中存储非原始类型?我可以设置一个原始的< - >类型的实例映射,但后来我失去了编译器支持,以确保在创建新实例时有人更新映射;如果你想要使用的新实例是一个匿名类,你就搞砸了 .

看起来这样做的唯一方法是声明MyFancyFragment摘要并创建扩展它的匿名内部类,返回目标内部片段(类似于涉及DialogFragment及其onCreateView()的许多常见示例);但是如果嵌套级别变得非常深,这会变得非常毛茸茸:( . 在我目前的情况下,我有一个DialogFragment包含一个包含一个包含MyFancyFragment的B的A,如果我开始需要动态子类,我必须对于每个我想要显示的弹出窗口(以及有几个),使用DialogFragment,A,B和MyFrancyFragment中的每一个进行子类化 . 对于泛型,我认为我可以声明一个A()并且可以,并且T会涓涓细流下来;但我无法弄清楚如何做或类似的事情 .

我们该怎么做呢?