方向从双窗格更改为单窗格

Kon*_*rer 2 android android-fragments android-orientation

横向和纵向的不同布局之间的方向变化似乎很容易,但是我无法找到解决当前情况的方法.

我想在横向模式下使用带有两个片段的双窗格布局

水库\布局,土地\ dashboard_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <fragment class="xxx.DashboardFragment"
            android:id="@+id/master_frag"
            android:layout_width="@dimen/timeline_size"
            android:layout_height="match_parent"/>

    <fragment class="xxx.TaskInstanceFragment"
            android:id="@+id/details_frag"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

和纵向模式下的单窗格布局

水库\布局\ dashboard_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <fragment class="xxx.DashboardFragment"
        android:id="@+id/master_frag"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

我想要注意DashboardFragment包含一个ViewPager.不知道它是否重要.

现在,当我将方向从横向(双)更改为纵向(单个)时,应用程序崩溃,因为它想要更新details_frag.当我以纵向开始活动时,它可以工作,只有从横向切换到肖像会产生问题.

在活动中有以下代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dashboard_activity);

    Fragment frag = getSupportFragmentManager().findFragmentById(R.id.details_frag);
    mDualFragments = frag != null;

    /* .. */
}
Run Code Online (Sandbox Code Playgroud)

现在,FragmentManager当我切换到纵向模式时,仍然会找到细节片段,因此mDualFragments仍然是真的但应该是假的,这导致稍后调用细节片段中的方法.

那么,这是为什么呢?:)

此致,Konsumierer

ekh*_*olm 5

因为findFragmentById不仅返回当前布局中的片段,还返回先前显示的片段.试试这个:

mDualFragments = frag != null && frag.isInLayout();
Run Code Online (Sandbox Code Playgroud)