一步一步学android之事件篇——单击事件(示例:改变屏幕显示方向)

昨天学习了单击事件,今天就来用一下,其实是想介绍下onConfigurationChanged()这个方法—->监听系统设置是否改变(改变则调用此方法内的处理逻辑)。下面用一个例子来仔细说明:

运行效果如下:

main.xml:

[html][/html]

view plaincopy

  1.     xmlns:tools=”http://schemas.android.com/tools”
  2.     android:orientation=”vertical”
  3.     android:layout_width=”match_parent”
  4.     android:layout_height=”match_parent” >
  5.     
  6.         android:id=”@+id/top”
  7.         android:layout_width=”wrap_content”
  8.         android:layout_height=”wrap_content”
  9.         android:text=”@string/top”/>
  10.     
  11.         android:id=”@+id/under”
  12.         android:layout_width=”wrap_content”
  13.         android:layout_height=”wrap_content”
  14.         android:src=”@drawable/img_1″/>

MainActivity.java:

[java][/java]

view plaincopy

  1. import android.os.Bundle;
  2. import android.app.Activity;
  3. import android.content.pm.ActivityInfo;
  4. import android.content.res.Configuration;
  5. import android.view.View.OnClickListener;
  6. import android.view.*;
  7. import android.widget.*;
  8. public class MainActivity extends Activity {
  9.     private Button change = null;
  10.     private ImageView img = null;
  11.     @Override
  12.     public void onCreate(Bundle savedInstanceState) {
  13.         super.onCreate(savedInstanceState);
  14.         setContentView(R.layout.activity_main);
  15.         initView();
  16.     }
  17.     //初始化
  18.     private void initView(){
  19.         this.change = (Button)super.findViewById(R.id.top);
  20.         this.img = (ImageView)super.findViewById(R.id.under);
  21.         this.change.setOnClickListener(new MyOnClickListener());
  22.     }
  23.     //监听按钮
  24.     private class MyOnClickListener implements OnClickListener
  25.     {
  26.         public  void onClick(View v)
  27.         {
  28.             if(MainActivity.this.getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
  29.             {
  30.                 MainActivity.this.change.setText(“错误,无法改变屏幕方向!”);
  31.             }
  32.             else
  33.             {   //当前为横屏的时候
  34.                 if(MainActivity.this.getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
  35.                 {
  36.                     //设置为竖屏显示
  37.                     MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  38.                 }
  39.                 //当前为竖屏的时候
  40.                 else if(MainActivity.this.getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
  41.                 {
  42.                     //设置为横屏显示
  43.                     MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  44.                 }
  45.             }
  46.         }
  47.     }
  48.     //系统设置改变时触发
  49.     public void onConfigurationChanged(Configuration newConfig)
  50.     {
  51.         //当前为横屏的时候
  52.         if(MainActivity.this.getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
  53.             MainActivity.this.change.setText(“改变屏幕方向为竖屏显示(当前为横屏显示)”);
  54.             MainActivity.this.img.setImageResource(R.drawable.img_2);
  55.         }
  56.         //当前为竖屏的时候
  57.         else if(MainActivity.this.getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
  58.             MainActivity.this.change.setText(“改变屏幕方向为横屏显示(当前为竖屏显示)”);
  59.             MainActivity.this.img.setImageResource(R.drawable.img_1);
  60.         }
  61.         super.onConfigurationChanged(newConfig);
  62.     }
  63. }

onConfigurationChanged()这个方法比较特殊,想要监听系统设置改变这个事件需要在AndroidMainFest.xml这个配置文件中添加几个配置,AndroidMainFest.xml:

[html][/html]

view plaincopy

  1. <manifest xmlns:android=”http://schemas.android.com/apk/res/android”
  2.     package=”com.example.example6_3″
  3.     android:versionCode=”1″
  4.     android:versionName=”1.0″ >
  5.     <uses-sdk
  6.         android:minSdkVersion=”8″ />
  7.     <application
  8.         android:icon=”@drawable/ic_launcher”
  9.         android:label=”@string/app_name”
  10.         android:theme=”@style/AppTheme” >
  11.         <activity
  12.             android:name=”.MainActivity”
  13.             android:label=”@string/title_activity_main”
  14.             android:configChanges=”orientation|keyboardHidden”
  15.             android:screenOrientation=”portrait”>
  16.             <intent-filter>
  17.                 <action android:name=”android.intent.action.MAIN” />
  18.                 <category android:name=”android.intent.category.LAUNCHER” />
  19.             </intent-filter>
  20.         </activity>
  21.     </application>
  22. <uses-permission
  23.         android:name=”android.permission.CHANGE_CONFIGURATION”/>
  24. </manifest>

主要加了:

[html][/html]

view plaincopy

  1. android:configChanges=”orientation|keyboardHidden”
  2.             android:screenOrientation=”portrait”

这个是一定要配置的,否则onConfigurationChanged不会起作用的。

[html][/html]

view plaincopy

  1. <uses-permission
  2.         android:name=”android.permission.CHANGE_CONFIGURATION”/>

这个也不能少,这个是配置操作权限,权限在Android中很重要,以后拨号,访问网络这些操作都要添加权限。

这里还有个要注意的地方,一般新建的默认工程中的AndroidMainFest.xml中会有这么一句   android:targetSdkVersion=”15″

我这里去掉了,如果不去掉就不能成功调用onConfigurationChanged这个方法,这是为什么呢,因为在Android 3.2开始,屏幕旋转的时候屏幕大小也跟着改变,如果想要在API LEVEL 13或者以上的设备上监听成功,必须加上|screenSize(加载keyBoardHidden后面),然后项目改成Android 3.2的(直接修改project.properties这个文件,将target=android-10 改成 target=android-13)。这样就能成功监听,我这里就直接将android:targetSdkVersion=”15″去掉。

这个例子就说到这里了。

[html][/html]

view plaincopy

  1. <pre></pre>
  2. <pre></pre>
  3. <pre></pre>
  4. <pre></pre>

标签