我正在编写一个使用Fragments for UI的应用程序,与Notepad示例代码非常相似。它有一个项目列表,然后是这些项目的编辑器。在横向模式下,列表和编辑器片段并排放置,但在纵向模式下,只有列表显示在主活动中,编辑器通过启动新活动显示。
在我的编辑器片段中,我调用了findViewById来获取UI的各个组件(主要是EditText字段)。在正常情况下,一切正常,但是当屏幕从横向旋转到纵向并且主活动被破坏并再次创建时,它似乎在我的编辑器片段上调用onActivityCreated(加上其他回调),即使它不是显示的一部分现在(因为在纵向模式下,它只是显示的列表)。
问题是,findViewById让UI组件返回null(我猜测是因为片段没有显示)。但为什么要打电话呢?它让我需要在任何地方进行无效检查,以确保我们不会在屏幕上没有尝试使用UI组件。
答案 0 :(得分:0)
当屏幕从横向旋转到纵向并且主活动被破坏并再次创建时,它似乎在我的编辑器片段上调用onActivityCreated(以及其他回调),即使它现在不是显示的一部分(因为在纵向模式下)它只是显示的列表。
正确。 Android会在配置更改期间重新创建所有现有片段。或者,如果使用FragmentTransaction
添加片段并使用setRetainInstance(true)
,则在配置更改期间会保留完全相同的片段对象。
但为什么要打电话呢?
见上文。
问题是,findViewById让UI组件返回null
您只需要在findViewById()
中拨打onCreateView()
,然后就知道“UI组件”是否存在,因为您是自己创建的。
这让我需要在任何地方进行空检查,以确保我不会在屏幕上没有尝试使用UI组件。
然后在isVisible()
上使用is...()
或其他Fragment
方法之一。或者,使用setRetainInstance(true)
以便不破坏和重新创建片段。或者,如果传入的Fragment
不是onCreate()
并且您现在处于肖像状态,则移除Bundle
(例如,在null
活动中。