V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Totato5749
V2EX  ›  Android

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

  •  
  •   Totato5749 · 2015-12-24 10:23:26 +08:00 · 9281 次点击
    这是一个创建于 3264 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 是如何产生的。

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

    关键的地方是 Activity 会自动帮你保存 Hierarchy 状态的,所以你可以 override onSaveInstanceState, 实现自己的逻辑,不调用 super implememt 应该就可以了。
    wanttofly
        4
    wanttofly  
       2015-12-25 09:28:03 +08:00
    楼上说的对, onSaveInstanceState()方法会保存当前 Activity 的状态。不过虽然 fragment 界面还在, fragment 作为 Activity 的成员变量是否还在呢?我也想问下。
    hyyou2010
        5
    hyyou2010  
       2016-01-12 13:37:28 +08:00
    楼主,我以前碰到的问题似乎和你差不多,我通过重载 fragment 的 onAttach 方法似乎解决了这个问题,详情写了一篇帖子: http://blog.csdn.net/max2005/article/details/20053461
    你看下是不是这个问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2652 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:08 · PVG 13:08 · LAX 21:08 · JFK 00:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.