重写onConfigurationChanged方法响应系统设置更改

《疯狂Android讲义(第4版)》第3章Android事件机制,本章将会详细介绍Android事件处理的各种实现细节,学完本章内容之后,再结合上一章的内容,读者将可以开发出界面友好、人机交互良好的Android应用。本节为大家介绍重写onConfigurationChanged方法响应系统设置更改。

 

3.4.2 重写onConfigurationChanged方法响应系统设置更改

如果程序需要监听系统设置的更改,则可以考虑重写Activity的onConfigurationChanged (Configuration newConfig)方法,该方法是一个基于回调的事件处理方法-当系统设置发生更改时,该方法会被自动触发。

为了在程序中动态地更改系统设置,我们可调用Activity的setRequestedOrientation(int)方法来修改屏幕的方向。

实例:监听屏幕方向的改变

该实例的界面布局很简单,该界面中仅包含一个普通按钮,该按钮用于动态修改系统屏幕的方向,此处不再给出系统界面布局代码。

该程序的Activity代码主要会调用Activity的setRequestedOrientation(int)方法来动态更改屏幕方向。除此之外,我们还重写了Activity的onConfigurationChanged(Configuration newConfig)方法,该方法可用于监听系统设置的更改。程序代码如下。

程序清单:codes\03\3.4\ConfigurationTest\change\src\main\java\org\crazyit\event\MainActivity.java

  1. public class MainActivity extends Activity  
  2. {  
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState)  
  5.     {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.activity_main);  
  8.         Button bn = findViewById(R.id.bn);  
  9.         // 为按钮绑定事件监听器  
  10.         bn.setOnClickListener(view –> {  
  11.             Configuration config = getResources().getConfiguration();  
  12.             // 如果当前是横屏  
  13.             if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {  
  14.                 // 设为竖屏  
  15.                 MainActivity.this.setRequestedOrientation(  
  16.                         ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
  17.             }  
  18.             // 如果当前是竖屏  
  19.             if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {  
  20.                 // 设为横屏  
  21.                 MainActivity.this.setRequestedOrientation(  
  22.                         ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
  23.             }  
  24.         });  
  25.     }  
  26.     // 重写该方法,用于监听系统设置的更改,主要是监控屏幕方向的更改  
  27.     @Override  
  28.     public void onConfigurationChanged(Configuration newConfig)  
  29.     {  
  30.         super.onConfigurationChanged(newConfig);  
  31.         String screen = newConfig.orientation ==  
  32.             Configuration.ORIENTATION_LANDSCAPE? “横向屏幕”: “竖向屏幕”;  
  33.         Toast.makeText(this, “系统的屏幕方向发生改变”  
  34.             + “\n修改后的屏幕方向为:” + screen, Toast.LENGTH_LONG).show();  
  35.     }  
  36. }  

上面程序中的前两行粗体字代码用于动态地修改手机屏幕的方向,接下来的粗体字代码重写了Activity的onConfigurationChanged(Configuration newConfig)方法,当系统设置发生更改时,该方法将会被自动回调。

除此之外,为了让该Activity能监听屏幕方向更改的事件,需要在配置该Activity时指定android:configChanges属性,该属性可以支持mcc、mnc、locale、touchscreen、keyboard、keyboardHidden、navigation、orientation、screenLayout、uiMode、screenSize、smallestScreenSize、fontScale属性值,其中orientation|screenSize属性值指定该Activity可以监听屏幕方向改变的事件。

因此,将应用的AndroidManifest.xml文件改为如下形式。

程序清单:codes\03\3.4\ConfigurationTest\change\main\src\AndroidManifest.xml

  1. <?xml version=“1.0” encoding=“utf-8”?> 
  2. <manifest xmlns:android=“http://schemas.android.com/apk/res/android” 
  3.     package=“org.crazyit.event”
  4.     <application 
  5.         android:allowBackup=“true” 
  6.         android:icon=“@mipmap/ic_launcher” 
  7.         android:label=“@string/app_name” 
  8.         android:roundIcon=“@mipmap/ic_launcher_round” 
  9.         android:supportsRtl=“true” 
  10.         android:theme=“@style/AppTheme”
  11.         <!– 设置Activity可以监听屏幕方向改变的事件 –> 
  12.         <activity android:name=“.MainActivity” 
  13.             android:configChanges=“orientation|screenSize”
  14.             <intent-filter
  15.                 <action android:name=“android.intent.action.MAIN” /> 
  16.                 <category android:name=“android.intent.category.LAUNCHER” /> 
  17.             </intent-filter
  18.         </activity
  19.     </application
  20. </manifest

上面的粗体字代码指定了该Activity可以监听屏幕方向改变的事件,这样当程序改变手机屏幕方向时,Activity的onConfigurationChanged()方法就会被回调。

提供上面的程序和设置之后,运行该程序,单击应用程序中的”更改屏幕方向”按钮,将可以看到如图3.8所示的界面。

 

 转自:https://book.51cto.com/art/201903/594021.htm?mobile