昨天学习了单击事件,今天就来用一下,其实是想介绍下onConfigurationChanged()这个方法---->监听系统设置是否改变(改变则调用此方法内的处理逻辑)。下面用一个例子来仔细说明:
运行效果如下:
main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/top"/>
<ImageView
android:id="@+id/under"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/img_1"/>
</LinearLayout>
MainActivity.java:
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.view.View.OnClickListener;
import android.view.*;
import android.widget.*;
public class MainActivity extends Activity {
private Button change = null;
private ImageView img = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
//初始化
private void initView(){
this.change = (Button)super.findViewById(R.id.top);
this.img = (ImageView)super.findViewById(R.id.under);
this.change.setOnClickListener(new MyOnClickListener());
}
//监听按钮
private class MyOnClickListener implements OnClickListener
{
public void onClick(View v)
{
if(MainActivity.this.getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
{
MainActivity.this.change.setText("错误,无法改变屏幕方向!");
}
else
{ //当前为横屏的时候
if(MainActivity.this.getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
{
//设置为竖屏显示
MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
//当前为竖屏的时候
else if(MainActivity.this.getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
{
//设置为横屏显示
MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
}
}
//系统设置改变时触发
public void onConfigurationChanged(Configuration newConfig)
{
//当前为横屏的时候
if(MainActivity.this.getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
MainActivity.this.change.setText("改变屏幕方向为竖屏显示(当前为横屏显示)");
MainActivity.this.img.setImageResource(R.drawable.img_2);
}
//当前为竖屏的时候
else if(MainActivity.this.getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
MainActivity.this.change.setText("改变屏幕方向为横屏显示(当前为竖屏显示)");
MainActivity.this.img.setImageResource(R.drawable.img_1);
}
super.onConfigurationChanged(newConfig);
}
}
onConfigurationChanged()这个方法比较特殊,想要监听系统设置改变这个事件需要在AndroidMainFest.xml这个配置文件中添加几个配置,AndroidMainFest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.example6_3"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission
android:name="android.permission.CHANGE_CONFIGURATION"/>
</manifest>
主要加了:
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait"
这个是一定要配置的,否则onConfigurationChanged不会起作用的。
<uses-permission
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"去掉。
这个例子就说到这里了。