FragmentTabsPager - 标签问题

时间:2013-03-14 16:00:35

标签: android android-fragments android-tabhost android-fragmentactivity

我已经关注了FragmentTabsPager的ABS示例,但我遇到了这个问题:

然而,在完成B之后,碎片不再附着在A.经过一些调试后,我发现在使用包含此条目的savedInstanceState完成B后调用A的onCreate()方法:

android:support:fragments=android.support.v4.app.FragmentManagerState$41bfffe0

我的理解是FragmentActivity在启动B之前保存了片段,在重新启动A之后,它尝试恢复它们。通过一些跟踪,我发现在完成B后,这些动作被称为:

Activity A: constructor called
Fragment F1: constructor called
Fragment F2: constructor called
Fragment F1: onAttach
Fragment F1: onCreate
Fragment F2: onAttach
Fragment F2: onCreate
Activity A: onCreate
Activity A: TabsAdapter created    
TabsAdapter: addTab android.widget.TabHost$TabSpec@41d949f8
Fragment F1: constructor called
TabsAdapter: addTab android.widget.TabHost$TabSpec@41d965d0
Fragment F2: constructor called
Fragment F1: onActivityCreated
Fragment F1: onCreateLoader
Fragment F2: onActivityCreated
Fragment F2: onCreateLoader
Activity A: onStart
Fragment F1: onResume
Fragment F1: onCreateLoader
Fragment F2: onResume
Fragment F2: onCreateLoader
Activity B: onStop
Fragment F1: onLoadFinished
Fragment F2: onLoadFinished

每个片段有2个实例,显示片段不附加到活动。

我该如何解决这个问题?我究竟做错了什么?也许如果有办法如何获得恢复的碎片?

提前致谢

1 个答案:

答案 0 :(得分:0)

如果我正确理解这一点,我建议这就是:

  1. 由于Fragment的F1和F2位于Activity A,Activity B 不应与Fragment创建或尝试互动
  2. Activity使用startActivityForResult开始Activity B,让B将项目(要添加到Fragment F1)传回A。
  3. Activity A应该使用Fragment处理将新项目发送到interface F1(就像您已经完成的那样)。
  4. interface A收到新项目(使用Activity方法)后,Fragment F1应该更新其数据并刷新其View
  5. 需要注意的另一点是,确保您的Activity A仅在Fragment中添加onCreate一次,它可以使用savedInstanceState来了解它是否正在重新创建或者如果它是它的第一次创造。请参阅http://developer.android.com/training/basics/fragments/fragment-ui.html

    修改

    啊,现在我看到更多你在问什么了。你有几种方法可以去这里。

    1. 使用FragmentManager和标记技巧从Fragment中获取ViewPager,然后根据需要进行更新。
      • 这稍微有些危险,因为它会返回可能不在Fragment的{​​{1}},并且需要在与之互动之前进行检查。
    2. 将模型与控制器分离,就像将数据放入静态单例,SQLite DB甚至首选项一样。这将允许应用程序的其他部分访问和编辑数据,而无需传递它。
      • onResume中,您的onResume将需要检查并更新其数据,以防其被更改。
      • 如果更改发生时Fragment已经在Activity,则interface还需要通过Fragment方法向他们提供刷新信号。
      • 或者,使用onResume中的Loader来监控数据集,并通过Fragment回调让Fragment的用户界面自动更新。