片段回调即使它不是UI的一部分

时间:2012-03-23 16:37:43

标签: java android android-layout android-fragments

我正在编写一个使用Fragments for UI的应用程序,与Notepad示例代码非常相似。它有一个项目列表,然后是这些项目的编辑器。在横向模式下,列表和编辑器片段并排放置,但在纵向模式下,只有列表显示在主活动中,编辑器通过启动新活动显示。

在我的编辑器片段中,我调用了findViewById来获取UI的各个组件(主要是EditText字段)。在正常情况下,一切正常,但是当屏幕从横向旋转到纵向并且主活动被破坏并再次创建时,它似乎在我的编辑器片段上调用onActivityCreated(加上其他回调),即使它不是显示的一部分现在(因为在纵向模式下,它只是显示的列表)。

问题是,findViewById让UI组件返回null(我猜测是因为片段没有显示)。但为什么要打电话呢?它让我需要在任何地方进行无效检查,以确保我们不会在屏幕上没有尝试使用UI组件。

1 个答案:

答案 0 :(得分:0)

  

当屏幕从横向旋转到纵向并且主活动被破坏并再次创建时,它似乎在我的编辑器片段上调用onActivityCreated(以及其他回调),即使它现在不是显示的一部分(因为在纵向模式下)它只是显示的列表。

正确。 Android会在配置更改期间重新创建所有现有片段。或者,如果使用FragmentTransaction添加片段并使用setRetainInstance(true),则在配置更改期间会保留完全相同的片段对象。

  

但为什么要打电话呢?

见上文。

  

问题是,findViewById让UI组件返回null

您只需要在findViewById()中拨打onCreateView(),然后就知道“UI组件”是否存在,因为您是自己创建的。

  

这让我需要在任何地方进行空检查,以确保我不会在屏幕上没有尝试使用UI组件。

然后在isVisible()上使用is...()或其他Fragment方法之一。或者,使用setRetainInstance(true)以便不破坏和重新创建片段。或者,如果传入的Fragment不是onCreate()并且您现在处于肖像状态,则移除Bundle(例如,在null活动中。