You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现手机禁用横屏模式,同时允许平板使用横屏模式?

适配手机与平板的屏幕方向需求

这问题我之前开发Android应用时也纠结过,毕竟既要照顾手机用户竖屏的使用习惯,又不能限制平板用户横屏的需求,给你分享两个实用的解决方案:

方案一:代码动态判断设备类型,统一设置方向

你可以先实现一个BaseActivity,让所有业务页面都继承它,在BaseActivity里根据设备类型自动设置屏幕方向,既能统一管理,又能灵活处理少数例外页面。

第一步:实现平板判断方法

先写一个工具方法判断当前设备是否为平板:

public static boolean isTablet(Context context) {
    return (context.getResources().getConfiguration().screenLayout 
            & Configuration.SCREENLAYOUT_SIZE_MASK) 
            >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}

第二步:在BaseActivity中设置方向

在BaseActivity的onCreate方法里添加方向控制逻辑:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    if (isTablet(this)) {
        // 平板强制锁定横屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    } else {
        // 手机默认锁定竖屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

例外处理

如果有少数手机页面需要支持横屏,只需要在对应的Activity里重写setRequestedOrientation方法,改成允许横屏即可:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 该手机页面允许随传感器切换横竖屏
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}

方案二:利用资源限定符区分设备

这种方式更贴合Android的资源适配设计思路,通过不同尺寸的资源文件定义设备类型,再在代码中读取配置:

第一步:添加设备类型配置文件

  1. res/values/bools.xml中定义手机的配置:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_tablet">false</bool>
</resources>
  1. res/values-large/bools.xml中定义平板的配置:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_tablet">true</bool>
</resources>

第二步:在BaseActivity中读取配置并设置方向

逻辑和方案一类似,只是判断设备的方式换成读取资源文件:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    boolean isTablet = getResources().getBoolean(R.bool.is_tablet);
    if (isTablet) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

为什么之前的layout-large-land方案无效?

你之前尝试的layout-large-land只是用来提供横屏布局资源,它的作用是当平板切换到横屏时加载这个文件夹下的布局,但不会限制系统切换屏幕方向。系统还是会根据传感器或用户操作切换方向,只是切换后会使用对应的布局,所以无法达到锁定方向的目的。

内容的提问来源于stack exchange,提问作者Tristen Edwin

火山引擎 最新活动