FragmentPagerAdapter在Fragment中的使用

10

我在实现一个基于多个ViewPager的设计时遇到了一些困难。

在高层次上,我有一个FragmentActivity,只有一个FrameLayout作为它的内容。我有三个不同的Fragment要显示,所有三个都是全屏的,每次只使用一个。

Fragment 1是一个基本的Fragment,其中包含一些TextView和ImageView。 Fragment 2有一个ViewPager和一个FragmentPagerAdapter,它提供了几个简单的Fragments。 Fragment 3有一个ViewPager和一个FragmentPagerAdapter,它提供了几个简单的Fragments(与Fragment 2不同)

在我的FragmentActivity onCreate()中,我获取FragmentManager并开始一个事务,用Fragment 2的新实例替换我的FrameLayout中的任何内容。

此时一切都按预期工作。 我在Fragment 2中的ViewPager完美地工作。

现在我有一个菜单选项,用Fragment 3的新实例替换了FrameLayout中的Fragment 2。 这也很好地工作。

问题出现在当我尝试用另一个replace事务将Fragment 2放回到FrameLayout中时。 我看到我的PagerIndicater在顶部,但我的页面是空白的。

我尝试了只创建Fragment 2的一个新实例并调用replace事务。 当我调用replace之前,在我的Fragments上设置标签并添加一个findFragmentByTag检查,而不是创建一个新实例。 两种方法都给我相同的结果,在第二次replace之后出现了空白页面。

供参考: 我的第一个设计只是一个有ViewPager和ViewIndicater的FragmentActivity。我只有来自上述描述的Fragment 2和Fragment 3以及一个菜单选项可以在它们之间切换。 为了切换,我定义了2个不同的FragmentPagerAdapter,并调用ViewPager.setAdapter来设置所选的FragmentPagerAdapter。 这完美地工作,但现在我需要一个新的顶级Fragment根本不使用ViewPager。 这就是为什么我决定将我的ViewPagers移动到它们自己的Fragments中。 我的想法是只需将我的Fragments替换到FrameLayout中即可。

我现在没有我的代码,所以无法发布任何内容。明天我会添加一些代码到我的问题中,以帮助方便回答。


当我在片段中使用片段时,我遇到了适配器的问题。我不确定你是否遇到了相同的问题,但是尝试将setAdapter的调用放入一个Runnable中。请参见此处:https://dev59.com/x2sz5IYBdhLWcg3wuKW6#10358889 - Paul Burke
2个回答

15

这个问题可能是Navigating back to FragmentPagerAdapter -> fragments are empty的重复。

如果你的应用程序可以处理它(API 17),请使用getChildFragmentManager()。当使用一个Fragment来托管你的ViewPager并使用FragmentPagerAdapter时,似乎会出现这个问题。改为使用FragmentStatePagerAdapter也似乎可以解决这个问题,但我仍然认为使用getChildFragmentManager()是最明智的选择。


使用FragmentStatePagerAdapter而不是FragmentPagerAdapter对我来说起了作用 :) - Patrick Boos
1
你好,我也在这个问题上使用了FragmentStatePagerAdapter。但是我注意到碎片没有从内存中删除?它们只是不断地添加,并且可能会导致内存泄漏。有什么解决方法吗? - John Ernest Guadalupe
@JohnErnestGuadalupe 你怎么知道这个片段仍然在内存中? - rupinderjeet

0

brockoli,你可以使用不是“好方法”。但对我来说,它有效。

您可以在视图中使用2个布局,其中绑定了片段。第一个用于带有片段的片段。第二个用于其他片段。

在用片段替换片段时,不要替换,而只需将第一个布局的可见性更改为gone,并将新片段添加到第二个布局中。在返回时,从第二个布局中删除片段,并将第一个布局的可见性设置为visible。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接