求助, Fragment 与 Viewpager 和 Activity 一起使用的一个问题

2015-12-24 10:23:26 +08:00
 Totato5749

App 结构很类似微信,底下是个 Tab, 同时也使用 Viewpager+Fragment 实现了类似微信的页面左右滑动功能。(先勿吐槽在安卓上用了 iOS 风格:))

现在想要实现类似微博客户端在首页的时候再次点击首页对应的 tab ,刷新首页中的列表。所以我在首页的 Fragment 中写了个 public 方法,在 Activity 中判断是否是再次点击了首页 tab ,如果是则用首页对应的 Fragment 对象调用该方法刷新该页面中的内容。

现在遇到的问题是, App 如果是第一次正常启动,点击 tab 刷新内容工作很正常。如果 App 转入后台,一段时间后系统将其清理掉后,从最近打开的应用再次打开该 App ,该 App 会从原来的页面恢复,而不是从 Manifest 中设置的启动 Activity 再次启动。

这时我再点击 tab 尝试刷新页面应用就会闪退,报 NullPointerException , 经过检查之后我发现,此时在 Activity 中持有的 Fragment 对象已经不是真正页面上显示的那个了。

我在 Activity 中是自己 new 了这些 Fragment 页面的对象然后通过 FragmentPagerAdapter 设置到 Viewpager 中,所以说当应用是恢复回来的时候仿佛根本没通过 FragmentPagerAdapter 来初始化各个页面的,(但是通过打 Log 我确认应用恢复 Activity 从 Oncreate 开始都走过了)所以就出现了 Activity 中持有的对象不是真正显示的那个。

现在求大牛指点下,应用恢复的时候我的 Viewpager 中的 fragment 是如何产生的。

9783 次点击
所在节点    Android
5 条回复
Tneciv
2015-12-24 12:31:59 +08:00
用 FragmentStatePagerAdapter 试试
stardust21
2015-12-24 13:56:51 +08:00
试试切换 Tab 的时候 onHiddenChanged()会不会被调用,会的话可以在这里面做刷新。
TJT
2015-12-24 14:13:35 +08:00
首先打开开发者选项的 Don't keep activities.
然后应该可以重现你的问题。

关键的地方是 Activity 会自动帮你保存 Hierarchy 状态的,所以你可以 override onSaveInstanceState, 实现自己的逻辑,不调用 super implememt 应该就可以了。
wanttofly
2015-12-25 09:28:03 +08:00
楼上说的对, onSaveInstanceState()方法会保存当前 Activity 的状态。不过虽然 fragment 界面还在, fragment 作为 Activity 的成员变量是否还在呢?我也想问下。
hyyou2010
2016-01-12 13:37:28 +08:00
楼主,我以前碰到的问题似乎和你差不多,我通过重载 fragment 的 onAttach 方法似乎解决了这个问题,详情写了一篇帖子: http://blog.csdn.net/max2005/article/details/20053461
你看下是不是这个问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/245778

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX