RecyclerView 在更改屏幕方向后被覆盖

RecyclerView gets overlayed after changing screen orientation

当我将屏幕方向从垂直更改为水平然后再次返回时,RecyclerView 被重新绘制并覆盖旧的(您可以在卡片视图之间看到它):

问题:如何抑制该行为,以便Android始终重用开始时创建的 RecyclerView?

片段XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:lib="http://schemas.android.com/tools"
    android:id="@+id/maschine_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/maschine_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false"
        android:scrollbars="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</LinearLayout>

主要XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    android:id="@+id/maschineCoordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:fitsSystemWindows="true"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar">

        <include
            android:id="@+id/toolbar_main"
            layout="@layout/toolbar"></include>

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
    android:id="@+id/machinelistcontainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior = "@string/appbar_scrolling_view_behavior"
    />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab_cloud_sync_maschinen"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:backgroundTint="@color/colorPrimary"
        android:src="@drawable/ic_cloud_sync_white_48dp"
        app:borderWidth="0dp"
        app:elevation="@dimen/fab_elevation"
        app:rippleColor="#00ffff"/>

</android.support.design.widget.CoordinatorLayout>

在你的activity的onCreate()方法中,检查activity是新启动的还是被系统重新创建的。仅在不重新创建片段时才将片段添加到其中。

@Override
protected void onCreate(Bundle savedInstanceState) {

    .....

    // If savedInstanceState is null, it means that the activity is freshly created
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
            .replace(R.id.machinelistcontainer, new MyFragment())
            .commit();
    }
}

在 AndroidManifest.xml 添加 android:configChanges 属性

<activity android:name=".MyActivity"
          android:configChanges="orientation"
          android:label="@string/app_name">

然后您可以在 Activity java 代码中处理 onConfigurationChanged() 中的更改

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}

android:configChanges and Handling Runtime Changes

中查看