簡體   English   中英

Android:在onConfigurationChanged中以編程方式更改片段寬度

[英]Android: change fragment width programmatically in onConfigurationChanged

當用戶將設備旋轉到橫向模式時嘗試更改片段寬度

那是我的片段:

    <fragment
        android:id = "@+id/menu"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        class="myPackage.MenuFragment" />

那就是我的onConfigurationChanged方法:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);
    findViewById(R.id.menu).getLayoutParams().width = (int) (getWindowManager()
            .getDefaultDisplay().getWidth());
}

但是當我旋轉設備時,輸出崩潰:

05-14 03:00:51.379:E / AndroidRuntime(3117):致命異常:主05-14 03:00:51.379:E / AndroidRuntime(3117):android.view.InflateException:二進制XML文件行#13:錯誤膨脹類片段05-14 03:00:51.379:E / AndroidRuntime(3117):位於android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:582)05-14 03:00:51.379:E / AndroidRuntime(3117):在android.view.LayoutInflater.rInflate(LayoutInflater.java:618)05-14 03:00:51.379:E / AndroidRuntime(3117):在android.view.LayoutInflater.rInflate(LayoutInflater.java:621)05-14 03 :00:51.379:E / AndroidRuntime(3117):位於android.view.LayoutInflater.inflate(LayoutInflater.java:407)05-14 03:00:51.379:E / AndroidRuntime(3117):位於android.view.LayoutInflater。 inflate(LayoutInflater.java:320)05-14 03:00:51.379:E / AndroidRuntime(3117):at android.view.LayoutInflater.inflate(LayoutInflater.java:276)05-14 03:00:51.379:E / AndroidRuntime(3117):位於com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)05-14 03:00:5 1.379:E / AndroidRuntime(3117):位於android.app.Activity.setContentView(Activity.java:1654)05-14 03:00:51.379:E / AndroidRuntime(3117):位於softserveinc.dbyst.reveal.Reveal_prototypeActivity.onConfigurationChanged (Reveal_prototypeActivity.java:71)05-14 03:00:51.379:E / AndroidRuntime(3117):at android.app.ActivityThread.performConfigurationChanged(ActivityThread.java:4153)05-14 03:00:51.379:E / AndroidRuntime (3117):位於android.app.ActivityThread.handleConfigurationChanged(ActivityThread.java:4246)05-14 03:00:51.379:E / AndroidRuntime(3117):位於android.app.ActivityThread $ H.handleMessage(ActivityThread.java: 2215)05-14 03:00:51.379:E / AndroidRuntime(3117):位於android.os.Handler.dispatchMessage(Handler.java:99)05-14 03:00:51.379:E / AndroidRuntime(3117):位於android.os.Looper.loop(Looper.java:143)05-14 03:00:51.379:E / AndroidRuntime(3117):位於android.app.ActivityThread.main(ActivityThread.java:4914)05-14 03: 00:51.379:E / AndroidRuntime(3117):at java.lang.reflect.Method.invokeNative(Native M ethod)05-14 03:00:51.379:E / AndroidRuntime(3117):at java.lang.reflect.Method.invoke(Method.java:521)05-14 03:00:51.379:E / AndroidRuntime(3117) :位於com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)05-14 03:00:51.379:E / AndroidRuntime(3117):位於com.android.internal.os.ZygoteInit.main (ZygoteInit.java:626)05-14 03:00:51.379:E / AndroidRuntime(3117):在dalvik.system.NativeStart.main(本地方法)05-14 03:00:51.379:E / AndroidRuntime(3117) :造成原因:java.lang.IllegalArgumentException:二進制XML文件行#13:重復的ID 0x7f050001,標簽null或父ID 0x0,以及myPackage.MenuFragment 05-14 03:00:51.379的另一個片段:E / AndroidRuntime(3117) :位於android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:275)05-14 03:00:51.379:E / AndroidRuntime(3117):位於android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:558 )05-14 03:00:51.379:E / AndroidRuntime(3117):...還有19個

我做錯了什么?

是的,因為您獲得了以XML定義的片段,所以setcontentview崩潰了。 您在這里有幾個選擇(據我所知,我在這個問題上不是專業人士;))。 您可以將FrameLayout放在片段所在的位置,然后使用替換事務添加片段:

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        fragmentTransaction.replace(R.id.frameLayout_container, yourFragmentObject);

        fragmentTransaction.commit();

或者,您可以測試setRetainInstance(true)是否可以工作。

暫無
暫無

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

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