Android:实时改变配置

本文介绍如何在Android中通过监听配置变化来避免应用重启,包括屏幕方向改变和键盘显示隐藏等事件。通过在manifest文件中设置特定属性并在Activity中覆写onConfigurationChanged方法,可以实现对这些变化的响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android通过终止、重启应用程序来重新加载资源文件,以做到对语言、区域和硬件实时变化的支持。

 

它的默认的行为不是总是方便和令人满意的,尤其当配置变化(如屏幕方向和键盘可视)、用户旋转设备或划出键盘等。你可以通过监测和响应定制你的应用程序来对这些变化作出响应。

 

为了能让Activity能监听实时的配置变化,需要在manifest节点里添加“android:configChanges”特性,指定你要处理的配置变化事件。

 

接下来的列表给出了你可以指定的配置变化的事件值:

 

 orientation                             屏幕在纵向和横向间旋转。

 keyboardHidden                    键盘显示或隐藏。

 fontScale                                 用户变更了首选的字体大小。

 locale                                       用户选择了不同的语言设定。

 keyboard                                 键盘类型变更,例如手机从12键盘切换到全键盘

 touchscreennavigation    键盘或导航方式变化,一般不会发生这样的事件。

 

你可以选择捕获多个事件,通过在各事件值间使用“|”。

 

接下来的代码片段显示了Activity要捕获屏幕方向和键盘可视的事件:

 

Java代码 
  1. <activity android:name=”.TodoList”  
  2.   
  3. android:label=”@string/app_name”  
  4.   
  5. android:theme=”@style/TodoTheme”  
  6.   
  7. android:configChanges=”orientation|keyboard”/>  

 

 

增加这个特性就会强制应用程序在指定的配置变化时不用再重新启动,而是触发Activity中的onConfigurationChanged方法。如下面的代码片段所示,override这个方法去捕获配置变化,通过传入的Configuration 对象的值进行合适的处理。需要提醒的是需要调用父类的方法,并且要重新加载Activity使用的资源,以防有变更。

 

Java代码 
  1. @Override  
  2.   
  3. public void onConfigurationChanged(Configuration _newConfig) {  
  4.   
  5. super.onConfigurationChanged(_newConfig);  
  6.   
  7.    
  8.   
  9. [ ... 基于资源值更新UI ... ]  
  10.   
  11.    
  12.   
  13. if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {  
  14.   
  15. [ ... 对不同的屏幕方向作出处理 ... ]  
  16.   
  17. }  
  18.   
  19.    
  20.   
  21. if (_newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) {  
  22.   
  23. [ ... 对键盘可见作出处理 ... ]  
  24.   
  25. }  
  26.   
  27. }  

 

 

当onConfigurationChanged 被调用时,Activity的资源变量都已经用新的值进行了更新,所以它们是安全的。

 

任何你没有显式指明的配置变化事件,都将由应用程序捕获,而且仍然会引起应用程序的重启,而不会调用onConfigurationChanged 方法。

 

### Android 应用程序中的视图焦点切换 在 Android 中,可以通过多种方式管理和控制视图之间的焦点切换。这不仅提高了用户体验,还使得通过方向键或其他输入设备导航更加直观。 #### 使用 `focusable` 属性设置可聚焦控件 为了使某个控件能够接收焦点,在布局文件中需为其添加属性 `android:focusable="true"` 和 `android:focusableInTouchMode="true"`[^1]: ```xml <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:focusable="true" android:focusableInTouchMode="true"/> ``` #### 动态调整焦点 除了静态配置外,还可以编程方式动态改变当前拥有焦点的组件。例如,当特定条件满足时强制将焦点转移到另一个视图上: ```java // Java 代码示例 button.requestFocus(); ``` 对于更复杂的场景,则可能需要用到 `findNextFocus()` 方法来查找下一个应该获得焦点的子视图[^3]: ```java View nextFocused = findViewById(android.R.id.content).findNextFocus(null, currentFocusedView, View.FOCUS_DOWN); if (nextFocused != null && nextFocused.isFocusable()) { nextFocused.requestFocus(); } ``` #### 控制焦点移动的方向 有时希望指定按下方向键后的焦点转移路径,这时可以在 XML 布局文件里定义相邻关系,比如上下左右四个方向上的邻居是谁: ```xml <!-- 定义向上按下的时候跳转到哪个view --> android:nextFocusUp="@+id/previous_view_id" <!-- 同理还有其他三个方向 --> android:nextFocusDown="@+id/next_view_id" android:nextFocusLeft="@+id/left_view_id" android:nextFocusRight="@+id/right_view_id" ``` 以上方法可以帮助开发者更好地掌控应用程序内的交互流程,特别是在支持非触屏操作的情况下尤为重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值