Android橫豎屏要解決的問題應該就兩個:一。布局問題;二。重新載入問題。
1.布局問題:如果不想讓軟體在橫豎屏之間切換,最簡單的辦法就是在項目的 AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation屬性,他有以下幾個參數:
"unspecified"
預設值 由系統來判斷顯示方向.判定的策略是和裝置相關的,所以不同的裝置會有不同的顯示方向.
"landscape"
橫屏顯示(寬比高要長)
"portrait"
豎屏顯示(高比寬要長)
"user"
使用者當前首選的方向
"behind"
和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
"sensor"
有物理的感應器來決定。如果使用者旋轉裝置這螢幕會橫豎屏切換。
"nosensor"
忽略物理感應器,這樣就不會隨著使用者旋轉裝置而更改了 ( "unspecified"設定除外 )。
也可以在Java代碼中通過setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);來設定。
如果要讓軟體在橫豎屏之間切換,由於橫豎屏的高寬會發生轉換,有可能會要求不同的布局。可以通過以下方法來切換布局:
1)在res目錄下建立layout-land和layout-port目錄,相應的layout檔案不變,比如main.xml。layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,模擬器會自動尋找。
2)通過this.getResources().getConfiguration().orientation來判斷當前是橫屏還是豎屏然後來載入相應的xml布局檔案。因為當螢幕變為橫屏的時候,系統會重新呼叫當前Activity的OnCreate方法,你可以把以下方法放在你的 OnCreate中來檢查當前的方向,然後可以讓你的SetContentView來載入不同的Layout xml.
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
Log.i("info", "landscape");
}
else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Log.i("info", "portrait");
}
2.重新載入問題。如果不需要從新載入,可以在androidmanifest.xml中加入配置 android:configChanges="orientation",配置android:configChanges的作用就是如文檔所說的:Specify one or more configuration changes that the activity will handle itself. If not specified, the activity will be restarted if any of these configuration changes happen in the system。這樣在程式中. Activity就不會重複的調用onCreate()甚至不會調用onPause.onResume.只會調用一個 onConfigurationChanged(Configuration newConfig)。
–*************其實在這裡我遇到兩個奇怪的問題,那就是
1.如果我在android:configChanges中只設定orientation,他依然會重新載入,只有設定了 orientation|keyboardHidden它才會只調用一個onConfigurationChanged(Configuration newConfig)
2.當橫屏變豎屏的時候,他會調用兩次onConfigurationChanged,而豎屏轉橫屏時他只調用一次onConfigurationChanged,真是太奇怪了。如果你知道,歡迎留言共同探討*************–
如果需要重新載入,則不需要做任何修改。不過如果需要在重新載入過程中儲存之前的操作內容或資料,則需要儲存之前的資料。然後在activity的 onCreate()中取出來。當然,如此就不能設定android:configChanges()了,否則就不會調用onCreate()方法。那麼資料可以儲存在哪呢?Android中四種儲存方法都可以,另外,還可以用Android為我們提供了 onRetainNonConfigurationInstance()方法來暫時儲存資料。
下面為此舉個例子:
儲存臨時圖片:
1. @Override
2. public Object onRetainNonConfigurationInstance() {
3. final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos];
4. keepPhotos(list);
5. return list;
6. }
之後便可以在activity的onCreate()函數中實現重新調用臨時檔案,在代碼中需要判斷系統是否需要重新載入臨時檔案。以下是放在OnCreate()函數中載入臨時檔案的代碼:
1. private void loadPhotos() {
2. final Object data = getLastNonConfigurationInstance();
3.
4. // The activity is starting for the first time, load the photos from Flickr
5. if (data == null) {
6. mTask = new GetPhotoListTask().execute(mCurrentPage);
7. } else {
8. // The activity was destroyed/created automatically, populate the grid
9. // of photos with the images loaded by the previous activity
10. final LoadedPhoto[] photos = (LoadedPhoto[]) data;
11. for (LoadedPhoto photo : photos) {
12. addPhoto(photo);
13. }
14. }
15. }
Android中當螢幕橫豎屏切換時,Activity的生命週期是重新載入(說明當前的Activity給銷毀了,但又重新執行載入),怎麼使螢幕橫豎屏切換時,當前的Activity不銷毀呢?
1. 在AndroidManifest.xml中為Activity設定configChanges屬性,
application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
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>
</application>
configChanges有如下選項: 1. orientation :螢幕在縱向和橫向間旋轉, 2. keyboardHidden:鍵盤顯示或隱藏 ,3.fontScale:使用者變更了首選的字型大小 4.locale : 使用者選擇了不同的語言設定,5. keyboard :鍵盤類型變更,例如手機從12鍵盤切換到全鍵盤 6. touchscreen或navigation:鍵盤或導航方式變化,
如果缺少了keyboardHidden選項 不能防止Activity的銷毀,並且在之後提到的onConfigurationChanged事件中 只能捕獲豎屏變橫屏的事件 不能捕獲橫屏變豎屏
2. 在對應的Activity中重寫:onConfigurationChanged 方法:
public class MainActivity extends Activity {
private TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i("--Main--", "onCreate");
textView=(TextView)findViewById(R.id.tv_id);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i("--Main--", "onConfigurationChanged");
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
textView.setText("當前螢幕為橫屏");
}else{
textView.setText("當前螢幕為豎屏");
}
}
}
摘自 圖靈的夢