"values-w320dp-land" 文件夹不适用于屏幕横向旋转

"values-w320dp-land" folder doesn't apply on screen landscape rotation

我的项目资源下有以下 2 个值文件夹:

  1. 这是我的 dimens.xml 用于 portrait 320dp 宽度屏幕的显示:

  1. 这是我的 dimens.xml 用于 landscape 320dp 宽度屏幕的显示:

我得到的是应用程序启动时的正确显示(横向显示和纵向显示):

现在我的问题是当我在应用程序运行时旋转屏幕时(假设应用程序首先以纵向模式启动),应用程序似乎没有从正确的值文件夹中检索值,这些文件夹应该是“values-w320dp-land" :

反之亦然,如果我在 ladscape 模式下启动应用程序后旋转屏幕,应用程序似乎不会从正确的值文件夹中检索值,该文件夹应该是“values-w320dp-port” ,我明白了:

更新 1

这是 AndroidManifest.xml 中的 activity 声明:

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name=".utils.json.VolleyApplication" >

        <activity
            android:name="com.test.momo.CategoriesActivity"
            android:label="@string/app_name"
            android:configChanges="orientation|screenSize" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <!--Monitor for Changes in Connectivity-->
                <!--<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>-->
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

</application>

这是我在 activity 布局中的 GridView 声明:

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/gridview_categories"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:columnWidth="@dimen/gridview_row_item_size"
            android:numColumns="@integer/num_columns"
            android:verticalSpacing="@dimen/gridview_row_item_spacing"
            android:horizontalSpacing="@dimen/gridview_row_item_spacing"
            android:stretchMode="none"
            android:layout_marginLeft="@dimen/gridview_row_item_spacing"
            android:layout_marginRight="@dimen/gridview_row_item_spacing"
            android:scrollbars="none"/>

更新 2

所以我终于非常接近解决方案了。现在,当我在运行时旋转屏幕时,在我对此处的 activity 代码进行了一些更改后,我的 GridView 会正确地将自身调整为纵向或横向模式:

@Override
public void onResume() {
    super.onResume();

    gridView.setNumColumns(getResources().getInteger(R.integer.num_columns));
    gridView.setColumnWidth(getResources().getDimensionPixelSize(R.dimen.gridview_row_item_size));
}

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

    gridView.setNumColumns(getResources().getInteger(R.integer.num_columns));
    gridView.setColumnWidth(getResources().getDimensionPixelSize(R.dimen.gridview_row_item_size));
}

除此之外,这是我在运行时(且仅当)将屏幕从纵向旋转到横向时得到的结果:

如您所见,我的 GridView 的第一个元素似乎保留了纵向模式的高度和宽度值。而其余的 GridView 元素显示正确。

我在这里错过了什么?

当您在清单中指定 android:configChanges 时,activity 将收到 onConfigurationChanged 回调。实现可能如下所示:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // Absolutely detach any adapters from lists.
    // RecyclerView adapters have caches that need to be cleared.
    // We can reuse adapter but not widgets.
    mList.setAdapter(null);

    // Inflate new view hierarchy.
    setContentView(R.layout.the_same_layout_as_in_on_create);

    // Update variables so they point to newly inflated widgets
    ButterKnife.bind(this); // update variables to point 

    // Reattach adapters
    mList.setAdapter(mAdapter);

    // Here follows everything else that touches widgets in onCreate...
}

请注意,如果我在 phone 上更改语言,activity 仍会完全重启,因为它不在 android:configChanges

另请注意,使用此方法时,activity 不遵循 onPause-onStop-onDestroy-onCreate-onStart-onResume 生命周期。

我的建议是学习如何正确保存状态和片段,然后重新创建整个 activity。最昂贵的操作是膨胀布局,无论如何你都必须这样做。