如何在方向更改后更改布局(无需重新加载应用)

时间:2016-03-16 13:50:03

标签: android android-layout android-fragments screen-orientation

当我将屏幕从横向旋转到纵向时,我的布局显示有问题。反之。

我创建了一个布局范围(layout-sw720dp-land / example.xml)和端口(layout-sw720dp-port / example.xml)。

直到一切正常。

在布局端口,我给出了精确的尺寸和布局以及其他精确的尺寸......

以前我在切换两个布局时遇到了问题。

从水平布局到垂直布局的过渡成功通过,但活动已被销毁并重建。

我通过在AndroidManifest.xml中插入此代码来解决问题:

android:configChanges="orientation|screenSize"

现在问题是从水平到垂直的过渡不是自动的。 例如,我水平打开应用程序,应用程序显示正确的布局(布局-sw720dp-land / example.xml,因为我使用平板电脑)但是一旦应用程序打开并且我垂直转动平板电脑,就不会显示垂直布局但仍然在水平版本..(例如在水平布局中我有一个按钮,其文本是“开始”,而在垂直我有相同的按钮,其文本是“完成”,当应用程序打开,我将平板电脑从水平旋转到垂直,布局转动让我看到水平版本,所以使用“开始”按钮)。

如何在不重新创建和销毁活动的情况下显示正确的布局?

N.B:使用片段...简而言之,我有一个activity_main.xml文件,它引用了活动“MainActivity.java”,里面有这段代码:

<FrameLayout
        android:layout_below="@+id/toolbar"
        android:id="@+id/fragment_container"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:foreground="@drawable/shadow_toolbar"/>

在这个FrameLayout内部我以这种方式查看两个布局:

FragmentExample fragment = new FragmentExample();
        android.support.v4.app.FragmentTransaction fragmentTransaction =
                getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();

在FragmentExample.java中有两个着名的布局:

public class FragmentExample extends Fragment {


public FragmentExample() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.example, container, false);

    // Inflate the layout for this fragment
    return rootView;
}

}

如何在不关闭和重新打开应用程序的情况下自动切换两个布局并重新创建它?

抱歉我的英文=)

1 个答案:

答案 0 :(得分:0)

您无法在横向和纵向模式下使用两种不同的布局,无需重新创建活动。参数android:configChanges="orientation|screenSize"表示不重新创建活动的活动,但它无法正常工作,因为在这种情况下,未设置另一个布局文件。

如果您想为横向和纵向模式使用两种不同的布局,请从android:configChanges="orientation|screenSize"中的活动中删除AndroidManifest.xml,并通过方法onSaveInstanceState(Bundle outState)和{{1来处理保存和恢复活动状态}}

示例(see full article):

onRestoreInstanceState(Bundle savedInstanceState)

请参阅this solution以保存和恢复片段。

另见Handling Runtime Changes文档。