"values-w320dp-land" 文件夹不适用于屏幕横向旋转
"values-w320dp-land" folder doesn't apply on screen landscape rotation
我的项目资源下有以下 2 个值文件夹:
- 这是我的
dimens.xml
用于 portrait
320dp 宽度屏幕的显示:
- 这是我的
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。最昂贵的操作是膨胀布局,无论如何你都必须这样做。
我的项目资源下有以下 2 个值文件夹:
- 这是我的
dimens.xml
用于portrait
320dp 宽度屏幕的显示:
- 这是我的
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。最昂贵的操作是膨胀布局,无论如何你都必须这样做。