仅为大型设备更改布局方向
Changing layout orientation only for large devices
我正在开发的一个 android 应用程序仅在屏幕尺寸超过 7 英寸时才需要更改屏幕布局。我为 land 和 portrait 模式的 large 和 xlarge 创建了不同的布局。这似乎运作良好。
我使用以下代码来确定屏幕尺寸并相应地更改布局:
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels, height = dm.heightPixels;
double dd = Math.sqrt(width * width + height * height)/dm.densityDpi;
double diagonal = (dd >= (Math.floor(dd) + 0.5) ? Math.ceil(dd) : Math.floor(dd));
if (diagonal < 7) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
问题:
7 英寸以下屏幕的布局也更改为横向模式。上面的代码无法阻止更改。请记住,还创建了 7 英寸以下的布局。
我在这里做错了什么?
Android docs 有一个很好的部分介绍了如何根据屏幕尺寸支持不同的布局
您只需在新的 res
文件夹中创建一个同名的布局文件即可。例如:
[If] your multi-pane tablet layout requires at least 600dp of screen width, you should place it in layout-sw600dp/
您还应该查看 Declaring Tablet Layouts for Android 3.2+ 的文档,因为这描述了创建平板电脑布局的最佳实践。
如果你想锁定方向,我建议查看 this answer,我在这里总结一下:
在res/bools.xml
中创建一个布尔值,然后在res/values-sw600dp
和res/values-xlarge
中重复此步骤
在后两个文件夹中将值更改为 false
后,您可以简单地调用:
if(getResources().getBoolean(R.bool.my_boolean)){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
这只会运行平板电脑设备上的代码
这里有两个因素,第一个是你的布局文件夹,第二个是你的代码,当你想为不同的屏幕表示不同的布局时,你应该使用 layout
、layout-sw600dp
, 和 layout-sw720dp
。在这种情况下,文件夹 layout
中的布局是低于 7in and the
layout-sw600dp' 的设备布局,表示最小尺寸为 7'in 的设备布局,文件夹 [=16] =]in 和直到 10`in 设备。
第二个因素是对这些布局应用方向,这很容易在您的 onCreate()
方法中使用 Configuration.class:
Configuration conf = getResources().getConfiguration();
if (conf.smallestScreenWidthDp >= 600) { // now it is at least a tablet with 7'in
if (conf.smallestScreenWidthDp >= 720) { // now it is a 10'in tablet
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); // Or portrait
} else { // now it is a 7'in tablet
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
} else { // now it is a regular device below 7`in
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
我正在开发的一个 android 应用程序仅在屏幕尺寸超过 7 英寸时才需要更改屏幕布局。我为 land 和 portrait 模式的 large 和 xlarge 创建了不同的布局。这似乎运作良好。
我使用以下代码来确定屏幕尺寸并相应地更改布局:
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels, height = dm.heightPixels;
double dd = Math.sqrt(width * width + height * height)/dm.densityDpi;
double diagonal = (dd >= (Math.floor(dd) + 0.5) ? Math.ceil(dd) : Math.floor(dd));
if (diagonal < 7) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
问题:
7 英寸以下屏幕的布局也更改为横向模式。上面的代码无法阻止更改。请记住,还创建了 7 英寸以下的布局。
我在这里做错了什么?
Android docs 有一个很好的部分介绍了如何根据屏幕尺寸支持不同的布局
您只需在新的 res
文件夹中创建一个同名的布局文件即可。例如:
[If] your multi-pane tablet layout requires at least 600dp of screen width, you should place it in layout-sw600dp/
您还应该查看 Declaring Tablet Layouts for Android 3.2+ 的文档,因为这描述了创建平板电脑布局的最佳实践。
如果你想锁定方向,我建议查看 this answer,我在这里总结一下:
在res/bools.xml
中创建一个布尔值,然后在res/values-sw600dp
和res/values-xlarge
中重复此步骤
在后两个文件夹中将值更改为 false
后,您可以简单地调用:
if(getResources().getBoolean(R.bool.my_boolean)){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
这只会运行平板电脑设备上的代码
这里有两个因素,第一个是你的布局文件夹,第二个是你的代码,当你想为不同的屏幕表示不同的布局时,你应该使用 layout
、layout-sw600dp
, 和 layout-sw720dp
。在这种情况下,文件夹 layout
中的布局是低于 7in and the
layout-sw600dp' 的设备布局,表示最小尺寸为 7'in 的设备布局,文件夹 [=16] =]in 和直到 10`in 设备。
第二个因素是对这些布局应用方向,这很容易在您的 onCreate()
方法中使用 Configuration.class:
Configuration conf = getResources().getConfiguration();
if (conf.smallestScreenWidthDp >= 600) { // now it is at least a tablet with 7'in
if (conf.smallestScreenWidthDp >= 720) { // now it is a 10'in tablet
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); // Or portrait
} else { // now it is a 7'in tablet
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
} else { // now it is a regular device below 7`in
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}