Android開發11——手機橫屏和豎屏與android:configChanges
目前大多數手機都支持重力感應隨之而來的就是屏幕方向改變的問題。對應普通開發者來說屏幕的隨意改變也會帶來困擾。在Google自帶的doc裏可以看到,如果設備的配置(Resources.Configuration中進行了定義)發生改變,那麼所有用戶界麵上的東西都需要進行更新以適應新的配置。因為Activity是與用戶交互的最主要的機製,它包含了處理配置改變的專門支持。除非你特殊指定,否則當配置發生改變(比如屏幕方向、語言、輸入設備等等的改變)時你當前的activity都將被銷毀,這銷毀是通過一個正常的activity生命周期過程進行的。如果activity之前正在前景畫麵,當這個實例的onDestroy()調用完成後將會啟動這個activity的一個新的實例,並將前麵那個實例中所保存的內容傳遞給新的實例。因為任何的應用資源(包括layout文件)都有可能由於任何配置值改變。
因此處理配置改變的唯一安全的方法就是重新獲取所有的資源,包括layout、繪圖資源(原文drawables)、字符串資源。由於activity已經如何保存自己的狀態並從這些狀態中重建自身,所以activity 重新啟動自身來獲得新的配置將是一個非常便利的途徑。
在一些特殊的情況中你可能希望當一種或者多種配置改變時避免重新啟動你的activity。你可以通過在manifest中設置android:configChanges屬性來實現這點。你可以在這裏聲明activity可以處理的任何配置改變,當這些配置改變時不會重新啟動activity,而會調用activity的onConfigurationChanged(Resources.Configuration)方法。
如果改變的配置中包含了你所無法處理的配置(在android:configChanges並未聲明),你的activity仍然要被重新啟動,而onConfigurationChanged(Resources.Configuration)將不會被調用。
在屏幕方向改變的時候,如果沒有處理,程序會自動重啟。對應一些需要保存用戶數據的應用中必須處理這種情況。
①在AndroidManifest.xml中設置Activity的android:configChanges屬性
<activity android:name=".AndroidLight" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
指定了屏幕方向改變和鍵盤隱藏時通知程序。不會重新啟動activity,而會調用activity的onConfigurationChanged(Resources.Configuration)方法。在程序中可以添加處理事件
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.d(TAG," == onConfigurationChanged"); processLayout();//自定義函數處理配置改變事件 }
②可在AndroidManifest.xml中設置Activity的android:screenOrientation屬性
<activity android:name=".AndroidLight" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
這樣指定屏幕方向為豎屏。屏幕就不會自動旋轉了。橫屏的值時landscape。
關於android:configChanges和android:screenOrientation的取值,可參看節選的博客
節選自https://ghostfromheaven.iteye.com/blog/967629
最後更新:2017-04-04 07:32:09