簡體   English   中英

Android App方向更改會重新啟動活動

[英]Android App orientation change restarts activity

我有一個活動,只要方向發生變化,它就會重新啟動。 我編寫了代碼來防止在清單文件中更改方向時重新啟動活動,如下所示:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.sample.appname.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>

在上面的代碼片段中, android:configChanges =“orientation | keyboardHidden”應該為我做的工作,但活動仍在重啟。 請讓我知道如何糾正它。

實際上你不應該阻止重新啟動Activity。 由於多種原因,在輪換更改后重新創建活動是必要的。 其中之一是布局必須膨脹以處理改變的屏幕尺寸和類似的東西(很容易想象布局在縱向上完全不同於橫向模式)。 但是,有一種方法可以告訴系統您自己處理屏幕更改。 因此,更改清單中的行

android:configChanges="orientation|keyboardHidden"

android:configChanges="orientation|screenSize"

然后不會重新創建活動。 您將通過onConfigurationChanged()方法獲得回調,以便在方向更改時執行某些操作。 如果您在配置更改時不想執行任何操作,請不要覆蓋Activity中的onConfigurationMethod() 有關詳細信息,請參閱Android開發者API指南中的此部分

我從這個答案得到了這個。 答案中還有兩種方法,但我認為上面描述的方法在您的情況下是最好的。

編輯:也許你必須添加keyboard|keyboardHiddenandroid:configChanges屬性,如在這個答案中所述


編輯#2:如果要檢索可以調用的設備的當前方向

Activity.getResources().getConfiguration().orientation

這將返回常量ORIENTATION_PORTRAITORIENTATION_LANDSCAPE

如果您對確切的旋轉角度感興趣,請使用

int rotation =  getWindowManager().getDefaultDisplay().getRotation();

並通過這里描述的開關盒實現差異化。

確定設備旋轉的第三種方法是getRequestedOrientation() ,它將返回文檔中定義的常量

android:configChanges =“orientation | screenSize”表示無論何時更改屏幕方向,都會調用Activity類中的以下方法。

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

        if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { body }
    }

這是andorid的本質,每當屏幕方向改變時,活動的整個生命周期再次運行。

保存和恢復某些數據。 你可以使用以下方法。

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);

    outState.putString("key","value");
}

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

    String s = savedInstanceState.getString("key");

}

嘗試改變

android:configChanges="orientation|keyboardHidden"

android:configChanges="orientation|screenSize"

這應該可以解決您的問題,但這不是一種有效的方法,更好的選擇請參考http://developer.android.com/training/basics/activity-lifecycle/recreating.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM