重写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
- public class MainActivity extends Activity
- {
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button bn = findViewById(R.id.bn);
- // 为按钮绑定事件监听器
- bn.setOnClickListener(view –> {
- Configuration config = getResources().getConfiguration();
- // 如果当前是横屏
- if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
- // 设为竖屏
- MainActivity.this.setRequestedOrientation(
- ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- }
- // 如果当前是竖屏
- if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
- // 设为横屏
- MainActivity.this.setRequestedOrientation(
- ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
- }
- });
- }
- // 重写该方法,用于监听系统设置的更改,主要是监控屏幕方向的更改
- @Override
- public void onConfigurationChanged(Configuration newConfig)
- {
- super.onConfigurationChanged(newConfig);
- String screen = newConfig.orientation ==
- Configuration.ORIENTATION_LANDSCAPE? “横向屏幕”: “竖向屏幕”;
- Toast.makeText(this, “系统的屏幕方向发生改变”
- + “\n修改后的屏幕方向为:” + screen, Toast.LENGTH_LONG).show();
- }
- }
上面程序中的前两行粗体字代码用于动态地修改手机屏幕的方向,接下来的粗体字代码重写了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
- <?xml version=“1.0” encoding=“utf-8”?>
- <manifest xmlns:android=“http://schemas.android.com/apk/res/android”
- package=“org.crazyit.event”>
- <application
- android:allowBackup=“true”
- android:icon=“@mipmap/ic_launcher”
- android:label=“@string/app_name”
- android:roundIcon=“@mipmap/ic_launcher_round”
- android:supportsRtl=“true”
- android:theme=“@style/AppTheme”>
- <!– 设置Activity可以监听屏幕方向改变的事件 –>
- <activity android:name=“.MainActivity”
- android:configChanges=“orientation|screenSize”>
- <intent-filter>
- <action android:name=“android.intent.action.MAIN” />
- <category android:name=“android.intent.category.LAUNCHER” />
- </intent-filter>
- </activity>
- </application>
- </manifest>
上面的粗体字代码指定了该Activity可以监听屏幕方向改变的事件,这样当程序改变手机屏幕方向时,Activity的onConfigurationChanged()方法就会被回调。
提供上面的程序和设置之后,运行该程序,单击应用程序中的”更改屏幕方向”按钮,将可以看到如图3.8所示的界面。
转自:https://book.51cto.com/art/201903/594021.htm?mobile