根据屏幕尺寸锁定屏幕旋转

时间:2014-12-11 17:26:59

标签: android android-screen-support screen-rotation

我正在处理一个应用程序,如果设备是平板电脑,则需要锁定到横向,如果设备是手机,则锁定为纵向。除了检查每个活动开始之外,还有一些干净的方法吗?

2 个答案:

答案 0 :(得分:3)

两年后我发现了这篇文章。我必须完全一样,这就是我所做的:

1 - 不要在 AndroidManifest.xml 中的任何位置声明screenOrientation属性。
2 - 创建文件夹 res / layout res / layout-w600dp
3 - 创建文件夹 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属性,因此每次加载活动时,Android都会首先搜索适合设备当前方向的布局,甚至在此之前活动有时间运行您的屏幕方向更改代码,如果找不到它,它将失败。

例如,假设您不想允许纵向方向。如果在启动应用程序或启动新活动时设备处于纵向方向,它将首先搜索活动的纵向布局,然后执行屏幕方向更改片段并最终更改横向图像的纵向布局。它会很快地完成它,所以你不会注意到,但它仍然需要找到一个纵向布局,否则它会崩溃。

因此,您必须让系统通过布局文件夹名称中不使用landport密度限定符来查找两种布局,或者,如果有必要,同时提供布局 - land layout-portrait 文件夹,里面有每个布局,即使它们是重复的。

答案 1 :(得分:0)

正如评论者所说,你可能想要考虑这是否真的是最好的方法。无论如何,假设这是值得的努力:

您可以在AndroidManifest.xml文件或单个活动代码中锁定屏幕。

e.g。 XML

<activity
android:name="com.example.activity"
android:label="@string/app_name"
android:screenOrientation="portrait">

JAVA

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

所以你可以这样做:

// get dimensions 
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
//whatever you want
int width=metrics.widthPixels;
int height=metrics.heightPixels;
int dens=metrics.densityDpi;

//compare dimensions to some pre-set value
if ( /*  device fits dimensions constraints for tablet for your purposes */) {
    //lock orientation
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
else {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

可能会创建一个辅助函数来接收设备指标或维度作为输入,如果它落在平板电脑范围内则返回true