Android非UI片段使用[重复]

Posted

技术标签:

【中文标题】Android非UI片段使用[重复]【英文标题】:Android non-UI Fragment usage [duplicate] 【发布时间】:2014-02-15 15:09:27 【问题描述】:

我正在查看 android documentation on Fragments 。定义 Fragment 的 UI 的布局可以在 Activity 的布局中定义,也可以在单独的 .xml 文件中定义,也可以根本不定义。

根据文档

您还可以使用片段为 Activity 提供背景行为,而无需呈现额外的 UI。

为什么我需要使用另一个 Fragment 向 Activity 添加功能,而不是在 Activity 中定义更多功能?是否会仅仅为了模块化而使用这样的非 UI 片段?采用这种方法还有其他原因吗?我希望有一个适合使用非 UI 片段的示例。

提前感谢您的帮助。

【问题讨论】:

Imo 原因之一是因为如果托管活动被破坏(当您旋转屏幕时),片段也可以持续存在,因此如果任务在片段和片段内部,管理后台任务会更简单没有被破坏 看看这个:***.com/questions/11531648/… @blackbelt 如果您需要后台任务,请使用由某个全局类生成的服务、AsyncTask 或 Runnable。当机制早已存在时,您关于将片段用于后台任务的论点似乎确实没有道理。 @AndroidDev 服务和 runnable 在 UI 线程上运行。它们不是后台任务。 【参考方案1】:

我想这是关于保留片段的,在片段内部你可以调用 setRetainedInstance(true),这样你的片段在配置更改期间不会被重新创建。通常,当您旋转设备时,将重新创建所有片段。如果你在 onCreate() 中调用 setRetainedInstance(true),那么你的 Fragment 实例将不会被重新创建。

它有什么用? - 您可以在片段中放置一些数据、数组等,并且在配置更改期间它不会被破坏。您也可以将异步任务放在这样的片段中,并且在主活动旋转后,您的片段中的异步任务仍然能够传递其结果。

片段的另一个有用功能是您可以轻松地在多个活动中重用它们。这意味着您可以在非 UI 片段中放置一些通用逻辑。您可以说为您的活动使用基类来完成它,但您只能扩展一个类。

以及来自谷歌的简单示例(实际上在保留片段中使用线程):

https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/src/com/example/android/apis/app/FragmentRetainInstance.java

【讨论】:

为了完整起见,除了旋转之外,您是否认为保留片段会被证明有用的任何其他此类配置更改? 只是为了完成答案:我开发的另一个用例。该片段有一个带有 collapseActionView 的菜单,可以触发搜索任务、显示自动完成建议并触发主 UI 的新片段。我猜它可以在 Activity 上完成,但是拥有 SearchBarFragment.java 并在我想要的 Activity 上实例化它只是更有条理和模块化。 @alig 屏幕旋转是您会遇到的最常见的情况,完整列表请看这里:developer.android.com/guide/topics/manifest/… 但是还有另外两种存储活动数据的方法,在屏幕旋转期间屏幕销毁后可用... 1.通过创建一个类并在Application类中创建它的对象,您还可以保持状态屏幕旋转期间的活动。 2.可以使用Activity的onSavedInstanceState()和onRestoreInstanceState()方法来保持状态。 @ImranKhanSaifi 与 1 您需要小心,如果系统决定终止您的应用程序(因为内存不足),那么当它被重新创建时,存储在应用程序对象中的对象将不再存在。使用 onSaveInstanceState 是更好的解决方案。

以上是关于Android非UI片段使用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Android片段管理器传递变量[重复]

java [Fragment片段] #Android #UI

android使用片段从相机或画廊获取照片[重复]

在Android中将数据从基本活动发送到片段[重复]

如何从 Android 中的 Fragment 访问 UI 元素?

Android:片段无法转换为上下文[重复]