【问题标题】:Lock screen rotation depending on screen size根据屏幕大小锁定屏幕旋转
【发布时间】:2014-12-11 17:26:59
【问题描述】:

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

【问题讨论】:

  • “我正在开发一个应用程序,如果设备是平板电脑,则需要锁定为横向,如果设备是手机,则需要锁定为纵向”——总之,呸。跨度>
  • @CommonsWare 我同意。我的客户没有。
  • 我也受不了仅限纵向的应用。
  • 我也受不了仅限横屏的应用。
  • 我那里没有电。我的客户对此非常具体,我不能失去这个项目。

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


【解决方案1】:

两年后我发现了这篇文章。我必须做同样的事情,这就是我所做的:

    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>

 
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属性,所以每次加载activity时,Android会首先搜索适合设备当前方向的布局,甚至在activity之前有时间运行你的屏幕方向更改代码,如果找不到它会失败。

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

因此,您必须让系统在布局文件夹名称中不使用 land 或 port 密度限定符来找到这两种布局,或者,如果有必要,请同时提供 layout-land 和一个 layout-portrait 文件夹,其中包含每个布局,即使它们是重复的。

【讨论】:

    【解决方案2】:

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

    您可以在 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

    【讨论】:

    • 现在我正在从资源中加载一个布尔值,这是一种更简单的方法。我只是想知道是否有办法直接在清单中执行此操作,而不必破解它。
    • 资源中的布尔值是什么?他的清单中没有逻辑或条件,因此您要么在清单中设置某些内容,要么不设置。我建议在 onCreate 中实现一个执行上述逻辑的自定义活动类,并让您的每个活动都扩展该自定义类并在其 onCreate 中调用超级。这样你只需要编写一次代码
    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多