1. 程式人生 > >Android之螢幕方向|顯示方式|Activity重建問題|橫豎屏切換不同的佈局

Android之螢幕方向|顯示方式|Activity重建問題|橫豎屏切換不同的佈局

兩種方式實現鎖定Activity執行時螢幕的方向:

(1)通過修改AndroidMainfest.xml配置檔案

修改Android/app/mainfests/AndroidMainfest.xml下的配置檔案如下:

<activity>節點的android:screenOrientation屬性可以完成該任務
//(portrait為保持豎屏,landscape為保持橫屏)

(2)通過java程式碼實現:


public class MainActivity extends Activity {

    @Override
    protected void onCreate
(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //通過程式碼設定螢幕方向,注意要在setContentView之前設定 //設定豎屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //設定橫屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setContentView(R.layout.activity_main); } }

兩種方式實現Activity全屏顯示:

(1)通過修改AndroidMainfest.xml配置檔案

<!--你可以在application的theme的節點中設定為全屏顯示方式  -->
<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen"
>

(2)通過java程式碼實現:

注意:java程式碼實現全屏顯示分為兩個步驟:

1.去標題欄

//通過程式碼去標題欄設定螢幕方向,注意要在setContentView之前設定         
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        WindowManager.LayoutParams.FLAG_FULLSCREEN);

2.去標題

//通過程式碼去標題設定螢幕方向,注意要在setContentView之前設定
        requestWindowFeature(Window.FEATURE_NO_TITLE);

實現方式Dialog(對話方塊)實現Activity顯示

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.DeviceDefault.Dialog"
        >

旋轉螢幕導致Activity重建怎麼辦?(最佳)

Android開發文件上專門有一小節解釋這個問題。簡單來說,Activity是負責與使用者互動的最主要機制,任何“設定”(Configuration)的改變都可能對Activity的介面造成影響,這時系統會銷燬並重建Activity以便反映新的Configuration。 “螢幕方向”(orientation)是一個Configuration,通過檢視Configuration類的javadoc可以看到其他Configuration還有哪些:如fontScale、keyboardHidden和locale等等。 當螢幕旋轉時,這個Configuration就發生了改變,因此當前顯示的Activity需要被重建,Activity物件會被終止,它的onPause()、onStop()和onDestroy()方法依次觸發,然後一個新的Activity物件被建立,onCreate()方法被觸發。假設螢幕旋轉前,使用者正在手機上填寫一個登錄檔單,如果處理不當,使用者會發現旋轉後的表單變成空白的了,嚴重影響使用體驗。

要解決這個問題有三種方法:

方法1:禁止旋轉螢幕

毫無疑問,這是最懶的辦法了,相當於迴避了本文提出的問題,方法如下看看就好:

<activity android:name=".MyActivity"
          android:screenOrientation="portrait"
          android:label="@string/app_name">


方法2:旋轉後恢復現場
----------
package com.example.scareenchange;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
    private EditText editText1;
    private int i;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText1=(EditText) findViewById(R.id.editText1);

        //注意一定要加if語句,不然程式異常
        if(savedInstanceState!=null) {
            //通過Bundle物件取出
            int i=savedInstanceState.getInt("info");
        }

    }

    public void button1(View v) {

        editText1.setText((i++)+"");
    }
    /*
     *這個方法會在重新建立Activity之前呼叫
     *我們在這個方法裡儲存物件,以解決Activity重新建立問題
     *
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
        Toast.makeText(getApplicationContext(), i+"", 1000).show();
        outState.putInt("info", i);
    }
}


----------



方法3:手工處理旋轉

,但也有辦法讓指定的Configuration改變時不重建Activity,方法是在AndroidManifest.xml裡通過android:configChanges屬性指定需要忽略的Configuration名字,例如下面這樣:

<activity android:name=".MyActivity"
          android:configChanges="keyboard|keyboardHidden|screenSize|orientation"
          android:label="@string/app_name">

這樣設定以後,當螢幕旋轉時Activity物件不會被銷燬——作為替代,Activity的onConfigurationChanged()方法被觸發,在這裡開發者可以獲取到當前的螢幕方向以便做必要的更新。既然這種情況下的Activity不會被銷燬,旋轉後Activity里正顯示的資訊(例如文字框中的文字)也就不會丟失了。
最佳實踐

考慮到旋轉螢幕並不是使Activity被銷燬重建的唯一因素,仍然推薦前文介紹過的方法:在onPause()裡持久化Activity狀態,在onCreate()裡恢復現場,可以做到一舉多得;雖然Google不推薦設定android:configChanges屬性的方式,但如果你的Activity橫向縱向共用同一個layout檔案,方法3無疑是最省事的。

橫豎屏切換不同的佈局

如果要讓軟體在橫豎屏之間切換,由於橫豎屏的高寬會發生轉換,有可能會要求不同的佈局。

可以通過以下兩種方法來切換佈局:

1)在res目錄下建立layout-land和layout-port目錄,相應的layout檔名不變,比如:layout-land是橫屏的layout,layout-port是豎屏的layout,其他的不用管,橫豎屏切換時程式呼叫Activity的onCreate方法中的setOnContent(xxx),並自動載入相應的佈局。

2)假如佈局資源不按照如上設定,則可以通過java程式碼來判斷當前是橫屏還是豎屏然後來載入相應的xml佈局檔案。因為當螢幕變為橫屏的時候,系統會重新載入當前Activity的onCreate方法(也就是說:該Activity的生命週期要重頭開始),你可以把以下方法放在你的onCreate中來檢查當前的方向,然後可以讓你的setContentView來載入不同的layout 。

/** 1:豎屏   2:橫屏 判斷螢幕以旋轉的方向 */
    private int orientation;
orientation=getResources().getConfiguration().orientation;