我想知道为什么不在 android:configChanges="keyboardHidden|orientation"
每个(几乎每个;)活动中使用它?
产品:
- 无需担心您的活动被轮换
- 更快
不太好:
- 如果它们取决于屏幕大小,则需要更改布局(例如,两列左右的布局)
坏:
- 没有灵活的方法来在不同的方向上具有不同的布局
- 使用片段时不太好
但是,如果我们不使用不同的布局,那为什么不呢?
我想知道为什么不在 android:configChanges="keyboardHidden|orientation"
每个(几乎每个;)活动中使用它?
产品:
不太好:
坏:
但是,如果我们不使用不同的布局,那为什么不呢?
Answers:
默认情况下,当Android上发生某些关键配置更改时(常见的例子是方向更改),Android会完全重启正在运行的Activity,以帮助其适应此类更改。
当您定义 android:configChanges="keyboardHidden|orientation"
在AndroidManifest中时,您会告诉Android:“当拔出键盘或旋转手机时,请不要执行默认重置;我要自己处理。是的,我知道我在做什么”
这是一件好事吗?我们很快就会看到...
您开始使用的优点之一是:
无需担心您的活动被轮换
在许多情况下,人们会错误地认为,当他们遇到因方向变化(“旋转”)而产生的错误时,他们可以简单地通过放入 android:configChanges="keyboardHidden|orientation"
。
但是,android:configChanges =“ keyboardHidden | orientation”只是创可贴。实际上,可以通过多种方式触发配置更改。例如,如果用户选择一种新的语言(即,语言环境已更改),您的活动将以与更改方向相同的方式重新启动。如果需要,可以查看所有不同类型的配置更改的列表。
编辑:更重要的是,但是,作为hackbod在评论中指出的那样,当您的应用程序处于后台并且Android决定通过杀死它释放一些内存时,您的活动也会重新开始。当用户返回到您的应用时,Android将尝试以其他方式更改配置的方式重新启动活动。如果您无法处理-用户将不会满意...
换句话说,使用android:configChanges="keyboardHidden|orientation"
并不能解决您的“后顾之忧”。正确的方法是对您的活动进行编码,以使他们对Android重新启动时感到满意。这是一个很好的做法,它将对您有所帮助,因此请习惯它。
正如您提到的,它有明显的优势。通过自己处理轮换的默认配置更改,可以加快处理速度。但是,这种速度确实带来了便利。
简而言之,如果纵向和横向都使用相同的布局,则覆盖会保持良好状态。无需完全重新加载活动,视图将只是四处移动以填充剩余空间。
但是,如果由于某种原因在设备处于横向状态时使用了不同的布局,那么Android重新加载您的Activity的事实就很好了,因为它随后会加载正确的布局。[如果您在此类Activity上使用覆盖,并希望在运行时进行一些神奇的重新布局...好吧,祝您好运-绝非易事]
无论如何,如果android:configChanges="keyboardHidden|orientation"
适合您,请使用它。但是,请务必测试发生更改时会发生什么情况,因为定向更改并不是触发完整的Activity重新启动的唯一方法。
Please don't do the default reset when the keyboard is pulled out
我从未见过因键盘拔出而重新启动活动!
从我的角度来看:如果横向和纵向模式下的布局都相同-您最好在应用程序中禁用两者之一。
我之所以这样说,是因为当我改变方向时,作为用户,我希望该应用程序能为我带来一些好处。如果我握住手机的方式无关紧要,则无需选择。
以一个拥有ListView的应用程序为例,在单击ListItem时希望显示该项目的详细视图。在横向视图中,您可以通过将屏幕一分为二来实现此目的,左侧为ListView,右侧为详细视图。在Portrait中,您将在一个屏幕中拥有列表,然后在选择ListItem时将屏幕更改为详细视图。在这种情况下,方向改变以及不同的布局都是有意义的。
我不明白为什么...。我认为偶尔重新启动是可以的... configChanges可以为我处理大多数情况...在某些类型的应用程序中可能会出现问题,但这实际上取决于应用程序的类型以及如何还原应用重新启动时的状态...当我的一个应用重新启动时,用户将重新登录,并且我的代码打开了上一个活动,而用户jus丢失了一些返回原位但并不重要的步骤。.在其他一些状态下,始终保持某些状态总是在重新启动时恢复。当活动重新开始时,必须是未使用该应用程序或某物...因此完全没有问题...例如在游戏中,这可能是问题,或者在其他我不知道的其他类型的应用程序中...
我说当您这样做时,应用程序在正常情况下就可以正常工作。而且代码更具可读性,无需大量逻辑来保存和还原您只能在其中产生新错误并必须始终对其进行维护的地方...确保android断电并杀死您的应用程序窗口会丢失上下文并重新开始,但这只是在特殊情况下发生,在我相信较新的设备上,这种情况越来越少...
所以杀了我,但是我在应用程序中非常成功地使用了它。不错的方法,但是大多数应用程序都可以忍受这一点。
是的,我认为暂停会比释放播放器更快。仍然有停顿。
现在找到了不会暂停歌曲的解决方案。
在清单中声明您将处理屏幕方向的配置更改,然后使用onConfigurationChanged方法加载布局文件。通过在logCat中执行此操作,我可以看到未调用onPause,onCreate和onResume,因此歌曲不会暂停。
更新清单以处理方向。
android:configChanges="orientation|screenSize"
添加此代码
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
setContentView(R.layout.activity_main);
}