为什么不总是使用android:configChanges =“keyboardHidden | orientation”?

时间:2011-10-19 08:45:26

标签: android android-layout

我想知道为什么不在每个(几乎每个;))活动中使用android:configChanges="keyboardHidden|orientation"

商品:

  • 无需担心您的活动被轮换
  • 它更快

不太好:

  • 如果取决于屏幕尺寸(例如,有两列左右的布局),则需要更改布局。

为:

  • 没有灵活的方法在不同的方向上拥有不同的布局
  • 使用片段时不太好

但如果我们不使用不同的布局,为什么不呢?

4 个答案:

答案 0 :(得分:318)

快速背景

默认情况下,当Android上发生某些关键配置更改时(常见的示例是方向更改),Android会完全重新启动正在运行的活动,以帮助其适应此类更改。

当您在AndroidManifest中定义android:configChanges="keyboardHidden|orientation"时,您正在告诉Android:“请不要在拔出键盘时执行默认重置,或者手机已旋转;我想自己处理此问题。是的,我知道我在做什么“

这是一件好事吗?我们很快就会看到......

不用担心?

你开始使用的一个专业是:

  

无需担心您的活动被轮换

在许多情况下,人们错误地认为当他们有一个由方向改变(“轮换”)产生的错误时,他们可以通过输入android:configChanges="keyboardHidden|orientation"来简单地修复它。

然而,android:configChanges =“keyboardHidden | orientation”只不过是一个bandaid。实际上,可以通过多种方式触发配置更改。例如,如果用户选择了一种新语言(即语言环境已更改),则您的活动将以与方向更改相同的方式重新启动。如果您愿意,可以查看a list of all the different types of config changes

修改:更重要的是,正如hackbod在评论中指出的那样,当您的应用处于后台并且Android决定释放一些内存时,您的活动也会重新启动通过杀死它。当用户返回您的应用程序时,Android将尝试以与其他配置更改时相同的方式重新启动活动。如果你无法处理 - 用户将不满意......

换句话说,使用android:configChanges="keyboardHidden|orientation"并不能解决您的“忧虑”。正确的方法是对您的活动进行编码,以便他们对Android重启的任何重启感到满意。这是一个很好的做法,可以帮助你在路上,所以习惯它。

那我何时才能使用它?

如你所说,有一个明显的优势。通过自己处理轮换来覆盖轮换的默认配置更改将加快速度。然而,这种速度确实带来了便利的代价。

简单地说,如果你对肖像和风景使用相同的布局,你可以通过覆盖来保持良好状态。不是对活动进行全面重新加载,视图将简单地移动以填充剩余空间。

但是,如果出于某种原因,当设备处于横向状态时您使用不同的布局,Android重新加载您的活动这一事实很好,因为它会加载正确的布局。 [如果你在这样的Activity上使用覆盖,并希望在运行时做一些神奇的重新布局......好吧,祝你好运 - 它远非简单]

快速摘要

无论如何,如果android:configChanges="keyboardHidden|orientation"适合您,请使用它。但请务必测试一些内容发生变化时会发生什么,因为方向更改不是触发完整Acitivity重启的唯一方法。

答案 1 :(得分:2)

从我的观点来看:如果横向和纵向模式下的布局相同 - 您也可以禁用应用中的两个中的一个。

我之所以这样说是因为当我改变方向时,我作为用户期望应用程序能够为我提供一些好处。如果我拿着手机的方式无关紧要,那么我就不需要选择了。

以您拥有ListView的应用为例,点击ListItem后,您希望显示该项目的详细视图。在横向中,您可以将屏幕分为两部分,左侧是ListView,右侧是详细视图。在纵向中,您可以在一个屏幕中显示列表,然后在选择ListItem时将屏幕更改为详细视图。在这种情况下,方向改变和不同的布局都是有意义的。

答案 2 :(得分:-1)

我不明白为什么......我认为偶尔的重启是正常的... configChanges为我处理大多数情况......好吧,在某些类型的应用程序中这可能是问题,但它实际上取决于应用程序的类型和如何在应用程序重新启动时恢复状态...当我的某个应用程序重新启动时,用户将被注销并且最后一个活动由我的代码打开,用户jus会失去一些步骤返回他所在的地方但并不是什么大不了...在其他一些状态是始终保持持续状态,重启时始终恢复某些状态。当活动重新启动时,它必须是那个应用程序没有被使用或者什么......所以没有任何问题...在游戏中,例如这可能是问题,或者在某些其他类型的应用程序我不知道...

我说当你这样做时,应用程序在正常情况下工作正常。代码更具可读性,无需保存和恢复所需的大量逻辑,只是你可以制造新的bug并且必须一直维护它...确保如果android失去动力并杀死你的应用程序窗口它会丢失上下文和再次开始,但这只发生在特殊情况下,在我认为这种情况越来越少的新设备上......

所以杀了我,但我非常成功地在应用程序中使用它... 机器人:configChanges = “区域|键盘| keyboardHidden |方向|屏幕布置| uiMode |屏幕尺寸| smallestScreenSize” 但我明白,对于某些特殊类型的应用程序来说,这可能不是一个好方法,但大多数应用程序可以正常使用它。

答案 3 :(得分:-3)

是的,我认为暂停将比释放播放器更快。尽管如此,仍有暂停。

现在找到了一个不会暂停歌曲的解决方案。

在清单中声明您将处理屏幕方向的配置更改,然后使用onConfigurationChanged方法加载布局文件。通过在logCat中执行此操作,我可以看到onPause,onCreate& onResume没有被调用,因此歌曲没有被暂停。

  1. 更新清单以处理方向。

    android:configChanges="orientation|screenSize"
    
  2. 添加此代码

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }