响应的系统设置的事件——重写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()方法就会被回调。

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

 

posted @ 2013-11-05 20:12  TealerProg  Views(957)  Comments(0Edit  收藏  举报