我正在开发一款应用程序,如果设备是平板电脑,则需要将其锁定为横向模式,如果设备是手机,则需要将其锁定为纵向模式。除了在每个活动启动时进行检查之外,是否有其他简洁的方法来实现这一点?
我在两年后发现了这篇文章。我需要做完全相同的事情,以下是我的做法:
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>
将相同的文件添加到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
密度限定符来查找两个布局,或者如果有必要,提供一个layout-land和一个layout-portrait文件夹,并在每个布局中都提供,即使它们是重复的。
正如一位评论者所说,你可能要考虑一下这是否真的是最佳方法。不管怎样,假设这是一个值得努力的事情:
你可以在AndroidManifest.xml文件中或者在各个Activity的代码中锁定屏幕。
例如: 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);
}