响应的系统设置的事件——重写onConfigurationChanged响应系统设置更改
如果程序需要监听系统设置的更改,则可以考虑重写Activity的onConfigurationChanged(Configuration newConfig)方法,该方法是一个基于回调的事件处理方法;当系统设置发生改变时,该方法会被自动触发。
为了在程序中动态地更改系统设置,我们可调用Activity的setRequestedOrientation(int)方法来修改屏幕方向。
实例:监听屏幕方向改变
该实例的界面布局很简单,该界面中仅包含一个普通按钮。其界面布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/bn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="更改屏幕方向" /> </LinearLayout>
该程序的Java代码主要会调用Activity的setRequestedOrientation(int)方法来动态更改屏幕方向。除此之外,我们还重写Activity的onConfigurationChanged(Configuration newConfig)方法,该方法可用于监听系统设置的更改。程序代码如下。
package com.example.studyevent; import android.os.Bundle; import android.app.Activity; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class ChangeCfg extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_change_cfg); Button bn=(Button)findViewById(R.id.bn); //为按钮绑定事件监听器 bn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub Configuration config=getResources().getConfiguration(); //如果当前是横屏 if(config.orientation==Configuration.ORIENTATION_LANDSCAPE) { //设为竖屏 ChangeCfg.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } //如果当前是竖屏 if(config.orientation==Configuration.ORIENTATION_PORTRAIT) { //设为横屏 ChangeCfg.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(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.change_cfg, menu); return true; } }
上面的程序中前面两行粗体字代码用于动态地修改手机屏幕的方向,接下来的粗体字代码重写了Activity的onConfigurationChanged(Configuration newConfig)方法,当系统设置发生更改时,该方法将会被自动回调。
除此之外,为了让该Activity能监听屏幕方向更改的事件,需要在配置该Activity时指定android:configChanges属性,该属性可以支持mcc、mnc、locale、touchscreen、keyboard、keyboardHidden、navigation、orientation、screenLayout、uiMode、screenSize、smallestScreenSize、fontScale属性值,其中orientation属性值指定该Activity可以监听屏幕方向改变的事件。
因此将应用的AndroidManifest.xml文件改为如下形式。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.studyevent" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="12" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!-- 设置Activity可以监听屏幕方向改变的事件 --> <activity android:name="com.example.studyevent.ChangeCfg" android:configChanges="orientation" android:label="@string/title_activity_change_cfg" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
上面的粗体字配置代码指定了该Activity可以监听屏幕方向改变的事件,这样当程序改变手机屏幕方向时,Activity的onConfigurationChanged()方法就会被回调。
提供上面的程序和设置之后,运行该程序,单击应用程序中“更改屏幕方向”按钮,将可以看到如图所示界面。