簡體   English   中英

旋轉時如何更改布局?

[英]How to change layout when rotate?

我在layout-normallayout-largelayout-land有一個xml 我想做的是在特定orientation使用提供的xml

我已經在這里搜索了,這是我已經嘗試過的方法。

1)我使用了不同的layout名稱,但使用了相同的ids ,並覆蓋onConfigurationChanged並在那里設置了layout 這是我的代碼

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

    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        setContentView(R.layout.activity_login2);
    }
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        setContentView(R.layout.activity_login );
    }
}

它確實發生了變化,但是當屏幕旋轉時, EditText的輸入數據消失了。 我嘗試使用onSaveInstanceState保存instance但仍然相同。 看起來它破壞了活動並創建了一個新活動,所有在onCreate初始化的小部件都消失了。

2)然后我找到layout-land ,然后將具有相同布局名稱的風景布局放在那里,就像layout-normallayout-large示例是

res/layout-land -> activity_login.xml

res/layout-normal-> activity_login.xml

res/layout-large-> activity_login.xml

並刪除代碼上的onConfigurationChanged ,但仍然無法正常工作。

在我的LoginActivity AndroidManifest中,

     <activity
        android:name=".LoginActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:theme="@style/DefaultTheme"
        android:windowSoftInputMode="adjustResize">
        <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 

屏幕旋轉時是否有改變布局的方法? 先感謝您。

“屏幕尺寸”限定符的優先級高於“方向”限定符。 https://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources

Android支持多個配置限定符,您可以通過用破折號分隔每個限定符來將多個限定符添加到一個目錄名稱。 表2按優先級列出了有效的配置限定符

假設您有以下文件:

res/
    layout-normal/
        layout.xml
    layout-land/
        layout.xml

如果您擁有普通的屏幕尺寸設備,則使用縱向還是橫向都沒關系。 總是選擇layout-normal而不是layout-land

您可以解決這兩種不同的方式。

首先,您可以將“默認”布局放在純layout目錄中(而不是layout-normal )。 所以你的文件將是

res/
    layout/
        layout.xml
    layout-land/
        layout.xml

其次,您可以組合使用限定詞,以使您明顯區分肖像和風景。 所以你的文件將是

res/
    layout-normal/
        layout.xml
    layout-normal-land/
        layout.xml

我認為您可能會錯過layout-land文件夾的要點。 應該是這樣的情況:當設備旋轉到橫向時,您在some_activity.xml指定的任何布局(例如some_activity.xml )都將自動使用。 您可以使用potrait版本已經使用的確切名稱來命名布局文件。 布局文件本身也可以使用相同的ID來命名出現的各種小部件。

關於在旋轉設備時丟失某些UI狀態,您可能必須重寫onSaveInstanceState(Bundle savedInstanceState)並在發生旋轉時從UI保存一些狀態。 不過,這實際上與顯示布局文件沒有任何關系。

首先,您不需要創建另一個.xml例如activity_login2 ,則可以使用相同的activity_login.xml

Android具有默認文件夾/ res / layout ,其中包括所有布局。 因此,每當旋轉設備時,它將使用相同的activity_login.xml文件。

您可以添加一個新文件夾/ res / layout-land,將activity_login.xml復制到其中並進行必要的調整。

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

    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        setContentView(R.layout.activity_login2); // it will use .xml from /res/layout
    }
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        setContentView(R.layout.activity_login); // it will use xml from /res/layout-land
    }
}

暫無
暫無

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

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