如何实现手机禁用横屏模式,同时允许平板使用横屏模式?
适配手机与平板的屏幕方向需求
这问题我之前开发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的资源适配设计思路,通过不同尺寸的资源文件定义设备类型,再在代码中读取配置:
第一步:添加设备类型配置文件
- 在
res/values/bools.xml中定义手机的配置:
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="is_tablet">false</bool> </resources>
- 在
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




