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

3
我正在开发一款应用程序,如果设备是平板电脑,则需要将其锁定为横向模式,如果设备是手机,则需要将其锁定为纵向模式。除了在每个活动启动时进行检查之外,是否有其他简洁的方法来实现这一点?

3
我正在开发一个应用程序,如果设备是平板电脑则需要锁定为横向屏幕,如果是手机则需要锁定为竖向屏幕。简而言之,真糟糕。 - undefined
@CommonsWare 我同意。但我的客户不同意。 - undefined
我也受不了只能竖屏显示的应用程序。 - undefined
我也无法忍受只能在横屏模式下使用的应用程序。 - undefined
我在那里没有权力。我的客户对此非常具体,我不能承担失去这个项目的风险。 - undefined
2个回答

4

我在两年后发现了这篇文章。我需要做完全相同的事情,以下是我的做法:

    1 - 在 AndroidManifest.xml 中不要声明 screenOrientation 属性。
    2 - 创建文件夹 res/layoutres/layout-w600dp
    3 - 创建文件夹 valuesvalues-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都会首先搜索适合设备当前方向的布局,甚至在活动还没有运行您的屏幕方向更改代码之前就会失败,如果找不到它。

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

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


0

正如一位评论者所说,你可能要考虑一下这是否真的是最佳方法。不管怎样,假设这是一个值得努力的事情:

你可以在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);
}

也许可以创建一个辅助函数,该函数接收设备的度量或尺寸作为输入,并在其处于平板电脑范围内时返回true。

现在我正在从资源中加载一个布尔值,这是一种比较简单的方法。我只是想知道是否有一种直接在清单文件中实现这个而不必进行任何操作的方式。 - undefined
资源中的布尔值是什么意思?清单文件中没有逻辑或条件语句,所以你要么在清单文件中设置某些内容,要么不设置。我建议实现一个自定义的活动类,在onCreate方法中执行上述逻辑,并让每个活动类都继承该自定义类并在它们的onCreate方法中调用super。这样你只需要编写一次代码。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接