在前一个例子中我们看到了屏幕方向的更改,事实上,当屏幕方向改变是,就会发生onconfigurationchanged()事件;虽然可以在更改方向是显示要更改的方向,但是并无法取得更改后的宽高或更改后的结果,此时,就必须通过onconfigurationchanged()的心事事件进行处理。
onconfigurationchanged()方法是当系统发生系统设置改变之后所触发的事件,其中唯一的传入参数为configuration对象,出来可以捕捉屏幕设置更改事件之外,也可扑捉其他系统设置更改事件,如隐藏键盘或打开键盘等。
onconfigurationchanged()方法是当系统发生系统设置改变之后所触发的事件,其中唯一的传入参数为configuration对象,出来可以捕捉屏幕设置更改事件之外,也可扑捉其他系统设置更改事件,如隐藏键盘或打开键盘等。
public class ex05_23 extends activity{ private textview mtextview01; private button mbutton01; /* 屏幕宽高 */ private int intscreenh,intscreenw; /** called when the activity is first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); /* 声明display对象,以取得屏幕宽高 */ final display defaultdisplay = getwindow().getwindowmanager().getdefaultdisplay(); intscreenh= defaultdisplay.getheight(); intscreenw = defaultdisplay.getwidth(); mbutton01 = (button)findviewbyid(r.id.mybutton1); mtextview01 = (textview)findviewbyid(r.id.mytextview1); mtextview01.settext(integer.tostring(intscreenw)+"x"+integer.tostring(intscreenh)); /* 当宽>高,表示为横式显示 */ if(intscreenw > intscreenh) { /* landscape */ mbutton01.settext(r.string.str_button2); } else { /* portrait */ mbutton01.settext(r.string.str_button1); } /* 按钮事件处理切换宽高 */ mbutton01.setonclicklistener(new button.onclicklistener() { @override public void onclick(view v) { // todo auto-generated method stub intscreenh= defaultdisplay.getheight(); intscreenw = defaultdisplay.getwidth(); /* 如果为landscape */ if(intscreenw > intscreenh) { /* landscape => portrait */ setrequestedorientation(activityinfo.screen_orientation_portrait); } else { /* portrait => landscape */ setrequestedorientation(activityinfo.screen_orientation_landscape); } /* 再一次取得屏幕宽高 */ intscreenh= defaultdisplay.getheight(); intscreenw = defaultdisplay.getwidth(); mtextview01.settext(integer.tostring(intscreenw)+"x"+integer.tostring(intscreenh)); } }); } @override public void onconfigurationchanged(configuration newconfig) { // todo auto-generated method stub /* 覆写onconfigurationchanged事件,捕捉当设定之后的值 */ if (newconfig.orientation == configuration.orientation_landscape) { /* 趁着事件发生之后,变更按钮上的文字 */ mbutton01.settext(r.string.str_button2); mmaketexttoast ( getresources().gettext(r.string.str_onconf_landscape).tostring(), false ); } /* 须设定configchanges属性才能捕捉onconfigurationchanged */ if (newconfig.orientation == configuration.orientation_portrait) { mbutton01.settext(r.string.str_button1); mmaketexttoast ( getresources().gettext(r.string.str_onconf_portrait).tostring(), false ); } if (newconfig.keyboardhidden == configuration.keyboardhidden_no) { } super.onconfigurationchanged(newconfig); } public void mmaketexttoast(string str, boolean islong) { if(islong==true) { toast.maketext(ex05_23.this, str, toast.length_long).show(); } else { toast.maketext(ex05_23.this, str, toast.length_short).show(); } }}
必须要在activity里设置configchanges属性,以作为系统设置更改时要扑捉的事件,除此之外,还需要获得系统设置更改的权限(<uses-permission android:name="android.permission.change_configuration"></uses-permission>)
<application android:icon="@drawable/icon" android:label="@string/app_name"> <!-- 必須設定activity的configchanges屬性 --> <activity android:name=".ex05_23" android:label="@string/app_name" android:configchanges="orientation|keyboard"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application> <uses-sdk android:minsdkversion="8" /> <!-- 必須設定change configuration權限 --> <uses-permission android:name="android.permission.change_configuration"></uses-permission>