两年后我发现了这篇文章。我必须做同样的事情,这就是我所做的:
1 - 不要在 AndroidManifest.xml 中的任何位置声明 screenOrientation 属性。
2 - 创建文件夹 res/layout 和 res/layout-w600dp。
3 - 创建文件夹 values 和 values-w600dp。
4 - 使用以下内容创建 values/layout.xml:
<resources>
<bool name="isTablet">false</bool>
</resources>
5 - 将相同的文件添加到 values-w600dp 将 isTablet 更改为 true:
<resources>
<bool name="isTablet">true</bool>
</resources>
6 - 在每个活动中检索此值并根据设备是否为平板电脑更改旋转:
// Locks the screen orientation to horizontal if it's a tablet
if (context.getResources().getBoolean(R.bool.isTablet)){
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
// Locks the screen orientation to vertical if it's a smartphone
} else {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
重要提示:由于我们之前没有指定screenOrientation属性,所以每次加载activity时,Android会首先搜索适合设备当前方向的布局,甚至在activity之前有时间运行你的屏幕方向更改代码,如果找不到它会失败。
例如,假设您不想允许纵向。如果在您启动应用程序或启动新活动时设备处于纵向,它将首先搜索活动的纵向布局,然后执行您的屏幕方向更改 sn-p 并最终将纵向布局更改为横向布局.虽然它会非常快,所以你不会注意到,但它仍然需要找到一个纵向布局,否则它会崩溃。
因此,您必须让系统在布局文件夹名称中不使用 land 或 port 密度限定符来找到这两种布局,或者,如果有必要,请同时提供 layout-land 和一个 layout-portrait 文件夹,其中包含每个布局,即使它们是重复的。