【问题标题】:FragmentTabsPager - tabs issueFragmentTabsPager - 标签问题
【发布时间】:2013-03-14 16:00:35
【问题描述】:

我已经遵循了 FragmentTabsPager 的 ABS 示例,但是我遇到了这个问题:

但是,在完成 B 之后,碎片不再附加到 A 上。经过一番调试,我发现A的onCreate()方法是在B完成后调用的,保存的InstanceState包含这个条目:

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个实例,显示的片段不附加到活动。

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

提前致谢

【问题讨论】:

  • 您最终要达到的目标尚不清楚。 Activity B 是否只是为了添加到 Fragment F1 显示的数据上?还是它试图显示Fragments F1 和 F2 的相同实例?如果您提供有关当前应用架构的更多信息,以及您希望每个部分做什么,这将有助于我们给出更好的答案。
  • @Steven Activity B 只添加了一个新项目,F1 应该显示该项目。哪些架构信息会有所帮助?请指定,以便我可以给您所需的内容。
  • @Steven 我终于找到了如何获得恢复的片段:getSupportFragmentManager().findFragmentByTag("android:switcher:VIEW_PAGER_RESOURCE_ID:TAB_ORDER"),它现在正在工作!但是,在我看来,这不是一个正确的方法。你知道如何通知 Activity 中包含的 Fragment 来更新它们的 UI 吗?

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


【解决方案1】:

如果我理解正确,以下是我的建议:

  1. 由于Fragments F1 和 F2 生活在Activity A 中,Activity B 不应创建或尝试与Fragment 进行交互
  2. Activity A 使用startActivityForResult 启动Activity B,并让B 将项目(要添加到Fragment F1)传回给A。
  3. Activity A 应该使用interface 处理将新项目发送到Fragment F1(就像您所做的那样)。
  4. Activity A 收到新项目(在您的interface 方法中)后,Fragment F1 应更新其数据并刷新其Views。

另外需要注意的是,确保你的Activity A 只在onCreate 中添加一次你的Fragments,它可以使用savedInstanceState 来知道它是否正在重新创建或者它是否是它的第一个创建.见http://developer.android.com/training/basics/fragments/fragment-ui.html

编辑

啊,现在我看到了更多你在问什么。您可以通过多种方式访问​​这里。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-05
    • 2011-06-10
    • 2014-02-11
    • 2012-11-08
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多