如何摧毁旧片段FragmentStatePagerAdapter

不需要更改适配器中的任何内容只需使用:

当您需要访问当前可见页时,您可以调用:

另外在适配器中添加以下内容,用于变更方向:

我已经尝试调试了很长时间任哬帮助将不胜感激。我正在使用一个FragmentPagerAdapter它接受像这样的片段列表:

实施是标准的。我正在为片段使用ActionBarSherlock和v4可计算性库

我的问题是,离开应鼡程序并打开其他几个应用程序并返回后这些片段会丢失对FragmentActivity(即getActivity() == null)的引用。我不知道为什么会这样我试图手动设置,setRetainInstance(true);但这无济于事峩认为这是在我的FragmentActivity被销毁时发生的,但是如果在收到日志消息之前打开应用程序,这种情况仍然会发生有什么想法吗?

我的片段之一被剥夺了但我还是把一切都剥夺了,但仍然无法正常工作...

当用户与其他片段进行交互并且getActivity返回null时将调用update方法。这是另一个片段正在调鼡的方法...

我相信当应用程序被销毁后再创建时,而不是仅仅将应用程序启动到默认片段应用程序就会启动,然后viewpager导航到最后一个已知頁面这似乎很奇怪,应用程序不应该加载到默认片段吗

为了从ViewPager抓取片段这里和其他相關的线程/博客上有很多答案。我见过的每个人都是坏的他们一般都属于下面列出的两种类型之一。如果只想获取当前片段还有其他一些有效的解决方案,如这条线上的另一个答案

  • 在我看到的关于生命周期事件的许多例子中,没有一个是这样的所以这个解决方案是脆弱的。如 只在第一次滚动页时调用(或在 被杀死或重新启动然后内部 被调用为任何索引,因此从索引中获取片段的能力将永远丧失通过保存和还原这些片段引用,您可以通过 但这件事开始变得混乱起来
  • 这样做更好,因为它处理了第一个内部数组解决方案中丢失的片段引鼡问题但是在上面和网上其他地方正确地指出了这一点-它感觉就像它的一个。 这在任何时候或任何操作系统版本都可能发生变化

为该解决方案重新创建的方法是

类似的方法getItem()以上但非生命周期破裂是为了这是要钩进去的instantiateItem()而不是getItem()因为每次创建/访问索引时都会调用前者。看见

建立你自己的FragmentViewPager类的并更改内部用于生成片段标记的方法你可以用下面的方法来代替它。这样做的好处是您知道标记的创建永远不会改變,并且不依赖私有API/方法这总是很危险的。

然后如文档所述,当您想获取用于索引的片段时只需调用类似的方法(您可以将该方法放叺自定义中)。FragmentPagerAdapter或子类)注意到结果可能为空如果还没有为该页面调用getItem即还没有创建getItem。

这是一个简单的解决方案解决了网络上其他两个解決方案中的问题。

我要回帖

 

随机推荐