我使用了两种方法:
我的方法几乎每次都是捕获旋转事件,如果需要调用setContentView并再次添加一些组件。如果没有,只需让它旋转,布局就可以适应。
到目前为止,我只看到了在具有非常动态的非常复杂结构的屏幕上销毁它的优点,每当我旋转而不是破坏时,在重新构建屏幕时会显示一些闪烁。
必须使用onSaveInstance,onRestoreInstace传递状态的开销有时非常容易出错,并且不知何故耗费时间。
我错过了什么吗?
更新
我的代码中没有任何“Orientation.XPTO == ...”。这是两种方法中的每一种的逻辑(代码被重用):
销毁时
onCreate -> DrawUI() setContentView and add views -> fill() add content
未被销毁时:
onCreate -> DrawUI() setContentView and add views -> fill() add content
onRotation -> DrawUI() setContentView and add views -> fill() add content
在轮换后调用setContentView时,它将为设备方向选择正确的布局(通过Google的Reto Meier https://stackoverflow.com/a/456918/327011检查此答案)
DrawUI和fill必须具有纵向和横向布局的逻辑,因为可以在两个方向中的每个方向上创建活动。
答案 0 :(得分:10)
我错过了什么吗?
是。您假设您的替代方案在某种程度上不易出错。
通过不进行销毁和重新创建循环,您必须确保为每个可能的配置更改而处理更改每个资源。
不要让活动在轮换中被销毁
除非您使用android:screenOrientation
强制您的活动进入单一方向(例如landscape
),否则您不仅可以处理与轮换相关的配置更改。您需要处理所有配置更改。否则,只要用户将设备放入扩展坞,将其从扩展坞中移除,更改语言设置,附加或分离键盘,更改全局字体缩放等,您的应用就会中断。
这反过来意味着在每次配置更改时,您需要:
PreferenceFragment
中的数组列表)问题是你会忘记一些事情。例如,您将错过更改与操作栏项关联的字符串,因此现在大部分UI都是西班牙语,操作栏项目是英语。您将要忘记的各种事情将不那么明显(您经常测试您的西班牙语翻译?)。
答案 1 :(得分:3)
您的活动已被销毁,以便您有机会为新方向重新配置自己。
来自developer.android.com:
当屏幕改变方向时,系统会破坏并重新创建 前台活动,因为屏幕配置已更改 并且您的活动可能需要加载替代资源(例如 布局)。
例如,在横向模式下,您可能需要完全不同的布局,或者可能需要加载不会显示拉伸的图形。执行此操作的最佳方法是允许再次创建活动,这将允许链接到布局文件以更改为更方向友好的布局。
有关详情以及如何处理方向更改,请参阅http://developer.android.com/training/basics/activity-lifecycle/recreating.html
如果您想禁用娱乐,可以添加
android:configChanges="orientation"
到AndroidManifest.xml中的Activity元素。这样就不会重新加载您的活动。
onSaveInstance
和onRestoreInstace
只应用于传递会话信息,例如TextField
中的当前文本,以及在onCreate之后只能再次加载的通用文件。
答案 2 :(得分:2)
如果您重新启动活动,则需要恢复大量数据,重新建立网络连接或执行其他密集型操作,然后使用onSaveInstanceState()
可能会导致您出现以下症状:
onSaveInstanceState()
回调不是为了携带大型物品而设计的。
在运行时配置更改期间保留对象:
重写
onRetainNonConfigurationInstance()
方法以返回您要保留的对象。 再次创建活动后,请致电getLastNonConfigurationInstance()
以恢复您的对象。
<强>然而强>
虽然您可以返回任何对象,但您永远不应传递与该活动相关联的对象,例如
Drawable
,Adapter
,View
或任何其他对象与Context
相关联。如果这样做,它将泄漏原始活动实例的所有视图和资源。 (资源泄漏意味着您的应用程序会保留它们并且不能进行垃圾回收,因此可能会丢失大量内存。)
除非你能够顺利通过Object
(s),否则我个人认为自己处理配置更改更有利,这意味着不要破坏。
如果您的目标API为13或更高:您必须在screenSize
中加入configChanges
。从API 13开始,屏幕尺寸也会随着方向的变化而变化,您需要考虑到这一点。在13之前,您的Activity将自行处理。
android:configChanges="orientation|screenSize"
答案 3 :(得分:0)
对于(风景/肖像)使用不同的布局时,有时会很有用。并使用不同类型的视图,例如纵向为ListView
,横向为GridView
。
答案 4 :(得分:0)
我猜你没有考虑创建android布局的标准方法。如果我错了,请纠正我。你是否分别用 -port,-land 两个res文件夹告诉android系统在运行时选择加载不同的资产和布局。
这个example可以为您提供管理不同方向布局的线索。
这是android stanard document。请查看“土地”和“港口”。
希望这会对你有所帮助。