我正在处理一个应用程序,如果设备是平板电脑,则需要锁定到横向,如果设备是手机,则锁定为纵向。除了检查每个活动开始之外,还有一些干净的方法吗?
答案 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都会首先搜索适合设备当前方向的布局,甚至在此之前活动有时间运行您的屏幕方向更改代码,如果找不到它,它将失败。
例如,假设您不想允许纵向方向。如果在启动应用程序或启动新活动时设备处于纵向方向,它将首先搜索活动的纵向布局,然后执行屏幕方向更改片段并最终更改横向图像的纵向布局。它会很快地完成它,所以你不会注意到,但它仍然需要找到一个纵向布局,否则它会崩溃。
因此,您必须让系统通过布局文件夹名称中不使用land
或port
密度限定符来查找两种布局,或者,如果有必要,同时提供布局 - 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