蓝牙键盘将导致活动销毁和重新创建。

14

如果我关闭蓝牙键盘或者离开安卓平板远了,这将导致活动销毁并重新创建。因此,如何避免这个问题呢?


1
帮助........................... - Chuang come fromTaiwan
4个回答

27
被接受的答案相比,我发现keyboard|keyboardHidden是不够的。我正在使用罗技蓝牙键盘(型号 #JNZYR0021)。这个才起作用:
<activity
  ...
  android:configChanges="orientation|screenSize|keyboard|keyboardHidden|navigation"
/>

显然,这款罗技键盘也会改变导航,这很奇怪,因为Android文档中说:

导航类型(轨迹球/ dpad)已更改。(这通常不应该发生。)

真是匪夷所思。


我添加了你建议的语句,但是在该活动中的EditText上没有打开本地键盘。 - Manikanta Ottiprolu
谢谢你的回答。它很有帮助。 - user2729200
我花了几个星期的时间来寻找这个问题。当客户没有提到他们在使用蓝牙键盘时,问题就出现了。谢谢! - Stephen McCormick
太棒了!你是怎么知道导航被改变的呢? - hemanth kumar
1
我也花了好几天时间来解决这个问题。添加“keyboard|keyboardHidden|navigation”是解决我的方法。 - J Avery
使用无线鼠标会导致活动重新创建。在configChanges中添加导航可以解决这个问题。 - Programmer007

19

也帮助解决了通过USB连接的键盘问题。谢谢! - Natalia

0

对我来说,在configChanges中添加"orientation|screenSize|keyboard|keyboardHidden|navigation"仍然会调用活动的onDestroy和onCreate。经过长时间的研究,我找到了这篇文章: https://developer.samsung.com/sdp/blog/en-us/2017/12/07/samsung-dex-lifecycle-on-switching-between-mobile-and-samsung-dex-mode

基本上,如果您使用联想的生产力模式或三星DeX,它仍然会重新创建应用程序,因此如果您希望应用程序在添加物理/蓝牙键盘时不重新创建自己,则需要添加所有这些内容:

<activity android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|uiMode|density">

此外,在AndroidManifest中添加以下内容以支持Samsung DeX:

<meta-data 
android:name="com.samsung.android.keepalive.density" 
android:value="true" />

0
在我的情况下,仅添加keyboard|keyboardHidden|navigation是不够的,Activity仍然会被重新创建。我尝试找到一种通用的方法来找到配置更改的原因。
首先需要做的是将Activity的configChanges中所有导致配置更改的原因都添加进去,以确保在您的情况下Activity不会被重新创建。然后重写Activity的OnConfigurationChange()方法,使用Configuration.diff()计算newConfig和当前配置(可以从getResources().getConfiguration()获取)之间的差异。结果是一个十进制数,将其转换为十六进制数,并计算由以CONFIG_开头的常量名称组合而成的值在ActivityInfo中的含义。
例如,配置差异为112(十进制),其十六进制为0x70。在这种情况下,我们有CONFIG_KEYBOARD = 0x0010;CONFIG_KEYBOARD_HIDDEN = 0x0020CONFIG_NAVIGATION = 0x0040,这意味着在此配置更改期间更改了这三个标志。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接