studio - android:configchanges




活動在Android上重新啟動 (20)

在我的Android應用程序中,當我旋轉設備(滑出鍵盤)時,我的Activity被重新啟動(調用onCreate )。 現在,這可能應該是這樣,但我在onCreate方法中做了很多初始設置,所以我需要:

  1. 將所有初始設置放在另一個功能中,以便在設備旋轉或旋轉時不會全部丟失
  2. 使其如此創建不被再次調用,佈局只是調整或
  3. 將應用限制在肖像內,以免onCreate被調用。

 onConfigurationChanged is called when the screen rotates. 
 (onCreate is no longer called when screen rotates due to manifest, see:  
 android:configChanges)

清單的哪一部分告訴它“不要調用onCreate() ”?

另外,谷歌的文檔說避免使用android:configChanges (除了作為最後的手段)....但是,然後他們建議所有使用android:configChanges的替代方法。

我的經驗是模擬器總是在旋轉時調用onCreate()
但是,我運行相同代碼的1-2個設備不會。 (不知道為什麼會有差異。)


Android 3.2及更高版本的更新:

警告 :從Android 3.2(API級別13)開始,當設備在縱向和橫向之間切換時, “屏幕大小”也會發生變化 。 因此,如果要在開發API級別13或更高級別時(由minSdkVersion和targetSdkVersion屬性聲明)防止由於方向更改導致運行時重新啟動,除"orientation"值之外,還必須包含"screenSize" "orientation"值。 也就是說,你必須聲明android:configChanges="orientation|screenSize" 。 但是,如果您的應用程序的目標級別為12或更低,則您的活動始終會自行處理此配置更改(即使在Android 3.2或更高版本的設備上運行,此配置更改也不會重新啟動您的活動)。


注意:如果將來有人面臨和我一樣的問題,我會發布這個答案。 對於我來說,下面這行不夠:

android:configChanges="orientation"

當我旋轉屏幕時,onConfigurationChanged(Configuration newConfig)方法沒有被調用。

解決方案:即使問題與方向有關,我也必須添加“screenSize”。 所以在AndroidManifest.xml文件中添加如下內容:

android:configChanges="keyboardHidden|orientation|screenSize"

然後實現onConfigurationChanged(Configuration newConfig)


不要試圖阻止onCreate()完全被解僱,也許嘗試檢查傳遞給事件的Bundle savedInstanceState以查看它是否為null。

例如,如果我有一些應該在真正創建Activity時運行的邏輯,而不是在每個方向更改上運行,那麼只有當savedInstanceState為null時,我才會在onCreate()運行該邏輯。

否則,我仍然希望佈局正確重繪方向。

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

        if(savedInstanceState == null){
            setupCloudMessaging();
        }
}

不知道這是否是最終的答案,但它適用於我。


你所描述的是默認行為。 您必須通過添加以下內容來自行檢測和處理這些事件:

android:configChanges

到你的清單,然後是你想要處理的變化。 所以為了定位,你可以使用:

android:configChanges="orientation"

而對於打開或關閉鍵盤,您可以使用:

android:configChanges="keyboardHidden"

如果你想處理兩者,你可以用pipe命令分隔它們,如:

android:configChanges="keyboardHidden|orientation"

這會在您調用的任何Activity中觸發onConfigurationChanged方法。 如果覆蓋該方法,則可以傳入新值。

希望這可以幫助。


你需要使用onSavedInstanceState方法來存儲所有的值到它的參數已經是捆綁

@Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        outPersistentState.putBoolean("key",value);
    }

並使用

@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        savedInstanceState.getBoolean("key");
    } 

回顧並設置該值以查看它將處理屏幕旋轉的對象


做這件事有很多種方法:

保存活動狀態

您可以將活動狀態保存在onSaveInstanceState

@Override
public void onSaveInstanceState(Bundle outState) {
    /*Save your data to be restored here
    Example : outState.putLong("time_state", time); , time is a long variable*/
    super.onSaveInstanceState(outState);
}

然後使用該bundle來恢復狀態。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState!= null){
       /*When rotation occurs
        Example : time = savedInstanceState.getLong("time_state", 0); */
    } else {
      //When onCreate is called for the first time
    }
}

自己處理方向更改

另一種選擇是自己處理方向變化。 但這不被認為是一種好的做法。

將此添加到您的清單文件。

android:configChanges="keyboardHidden|orientation"

對於Android 3.2及更高版本:

android:configChanges="keyboardHidden|orientation|screenSize"

@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);

if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //Handle rotation from landscape to portarit mode here
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
        //Handle rotation from portrait to landscape mode here
    }
}

限制旋轉

您還可以將活動限制為縱向或橫向模式以避免旋轉。

將其添加到清單文件中的活動標記中:

        android:screenOrientation="portrait"

或者在您的活動中以編程方式實施:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

儘管它不是“Android方式”,但我通過自己處理方向更改並簡單地在視圖中重新定位窗口小部件以考慮更改的方向而獲得了非常好的結果。 這比任何其他方法都快,因為您的視圖不必保存和恢復。 它還為用戶提供更加無縫的體驗,因為重新定位的小部件完全相同,只是移動和/或調整大小。 這種方式不僅可以保存模型狀態,還可以保存視圖狀態。

RelativeLayout有時可以成為一個不時重新定位的視圖的不錯選擇。 您只需提供一組縱向佈局參數和一組景觀佈局參數,每個子部件都有不同的相對定位規則。 然後,在您的onConfigurationChanged()方法中,將適當的一個傳遞給每個孩子的setLayoutParams()調用。 如果任何孩子控製本身需要在內部重新定位,您只需調用該孩子的方法來執行重新定向。 該孩子同樣對其任何需要內部重新定位的子控件調用方法,等等。


AndroidManifest.xml修正屏幕方向(橫向或縱向)

android:screenOrientation="portrait"android:screenOrientation="landscape"

為此,您的onResume()方法不會被調用。


manifest的活動部分中,添加:

android:configChanges="keyboardHidden|orientation"

將下面的代碼放入Manifest.xml <activity>標籤內:

android:configChanges="screenLayout|screenSize|orientation"

將下面的代碼放入您的Android Manifest Activity中。

android:configChanges="orientation"

當您改變方向時,這不會重新啟動您的活動。


您也可以考慮使用Android平台的跨方向更改持久化數據的方式: onRetainNonConfigurationInstance()getLastNonConfigurationInstance()

這使您可以跨配置更改持久保存數據,例如您可能從服務器獲取的信息或onCreate或之後計算的其他信息,同時還允許Android使用xml文件重新佈局您的Activity正在使用。

看到here這裡

應該注意的是,現在不推薦使用這些方法(雖然比上面大多數解決方案提示的處理方向更改更靈活),但建議每個人都切換到Fragments ,而是在要保留的每個Fragment上使用setRetainInstance(true)


您可以使用此代碼鎖定屏幕的當前方向...

int currentOrientation =context.getResources().getConfiguration().orientation;
        if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) {
            ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            ((Activity) context). setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }

我剛剛發現了這個傳說:

為了通過方向更改保持Activity活動,並通過onConfigurationChanged處理它,上面的文檔代碼示例在Manifest文件中顯示了這一點:

android:configChanges="keyboardHidden|orientation"

它具有始終可以工作的額外好處。

獎金知識是省略keyboardHidden onConfigurationChanged可能看起來合乎邏輯,但它會導致模擬器失敗(對於Android 2.1至少):僅指定orientation將使模擬器有時會調用OnCreateonConfigurationChanged ,並且僅OnCreate其他時間進行OnCreate

我還沒有看到設備出現故障,但我聽說過仿真器不能用於其他設備。 所以這是值得記錄的。


我只是簡單地補充說

     android:configChanges="keyboard|keyboardHidden|orientation"

在清單文件中並沒有在我的活動中添加任何onConfigurationChanged方法。

所以每次鍵盤滑出或沒有任何反應


每當屏幕旋轉時,打開的活動結束並再次調用onCreate()。

1。 當屏幕旋轉時,你可以做一件事情來保存活動的狀態,這樣,當活動的onCreate()被再次調用時,你可以恢復所有舊東西。 請參閱this鏈接

2。 如果要防止重新啟動活動,只需在manifest.xml文件中放置以下行。

  <activity android:name=".Youractivity"
  android:configChanges="orientation|screenSize"/>

清單中添加此行android:configChanges =“orientation | screenSize”



這很簡單,只需執行以下步驟:

<activity
    android:name=".Test"
    android:configChanges="orientation|screenSize"
    android:screenOrientation="landscape" >
</activity>

這適用於我:

注意:方向取決於您的要求







android-activity