【问题标题】:In which situation we want to add fragment without container?在什么情况下我们要添加没有容器的片段?
【发布时间】:2015-12-14 08:28:02
【问题描述】:

Fragment 事务有add(Fragment fragment, String tag) 方法,它没有将fragment 放到容器中,所以它不能有视图。可以用来做什么?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    来自 Android 文档:

    但是,片段不需要成为活动布局的一部分;您也可以使用没有自己 UI 的片段作为 Activity 的隐形工作者。

    这个目的怎么样?

    简单示例:Activity 启动 AsyncTask,但当设备旋转时 activity 重新启动,导致 AsyncTask 失去与 UI 线程的连接。但是这个Activity 可以容纳一个Fragment(不可见,根本没有UI)可以处理所有AsyncTask 工作。当Activity 重新创建时,Android 操作系统会注意重新附加Fragment,因此不会发生数据丢失。

    【讨论】:

    • 不是处理程序,异步任务和服务是为了那个目的吗?或者有一种情况,当片段作为工人比上述任何一个更好时。我很难弄清楚,因为片段在主线程中运行
    • 您已经在同一评论中提出并回答了您自己的问题 :) (“作为片段在主线程中运行”)
    • 请注意,可能有很好的例子,它利用片段生命周期与 asynctask 或Thread 的组合。但似乎这样的片段从来没有暂停和恢复调用
    【解决方案2】:

    对于对话框,您在普通应用层上没有任何容器。直接用WindowManager添加到Window上(各类图层见WindowManager.LayoutParams)。

    DialogFragment 有一个类似 DialogFragment.html#show(android.app.FragmentManager, java.lang.String) 的 API,对应于此。

    【讨论】:

      【解决方案3】:

      您可以使用不带 UI(容器)的片段作为后台工作人员(一个好处是您可以在轮换等期间保留它)以及在轮换和其他更改期间保留数据。

      强烈推荐阅读http://developer.android.com/guide/components/fragments.html

      实例保留示例:https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/src/com/example/android/apis/app/FragmentRetainInstance.java

      另外,这里有类似的问题(所以这个问题似乎是重复的,但由于赏金而无法标记):

      【讨论】:

        【解决方案4】:

        正如@Lucius Hipan 提到的,它可以用来防止数据丢失。 几乎总是将这个片段之王用作保留容器(在 onCreate 方法中调用 setRetainInstance(true)),然后在设备配置更改(例如方向更改)之后,片段将不会重新创建,但会记住以前的状态。 推荐使用 asynctask。

        这是一个例子:

        有登录活动。用户输入他们的凭据并按下登录按钮。发生配置更改后(用户旋转手机)。因此,网络任务已完成,但您的处理程序现在没有监听它。如果您显示任何登录动画,它可以通过 savedInstance 存储,但侦听器不能。而不是创建服务,您可以简单地使用持久异步任务和接口创建新的保留片段以与活动通信。

        对于使用总线库夸大其词的小型项目,此方法是一个很好的折衷方案。

        【讨论】:

          【解决方案5】:

          通过调用 add(Fragment fragment, String tag) 方法在内部调用 add(int containerId, Fragment fragment, String tag) 并使用 0 containerId。那将是 add(0, fragment, tag). 如果 0 作为containerId 提供,则不会将片段放入容器中。

          【讨论】:

          • 一样,我写的有问题,不是吗?
          猜你喜欢
          • 2020-01-05
          • 2021-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多