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

如何仅设置平板端应用为竖屏?移动端保留屏幕旋转功能

解决方案:移动端允许旋转,平板端强制竖屏

这个问题我之前也碰到过,直接在Manifest里设置android:screenOrientation="portrait"确实没法区分设备类型,这里有几个靠谱的实现方案,按你的需求选就行:


方法1:使用资源限定符(推荐,Android官方适配方式)

这种方式通过资源文件的限定符自动适配设备类型,代码侵入性最低:

  1. 创建平板专用资源目录:在res文件夹下新建values-sw600dp目录(sw600dp是Android定义的平板最小宽度阈值,大部分平板都满足这个条件)

  2. 定义平板判断的布尔值

    • res/values-sw600dp/bool.xml中添加:
      <?xml version="1.0" encoding="utf-8"?>
      <resources>
          <bool name="is_tablet">true</bool>
      </resources>
      
    • 在默认的res/values/bool.xml中添加:
      <?xml version="1.0" encoding="utf-8"?>
      <resources>
          <bool name="is_tablet">false</bool>
      </resources>
      
  3. 在Activity中动态设置方向
    不管是Kotlin还是Java,都可以在onCreate方法里读取这个布尔值,设置对应的屏幕方向:

    Kotlin示例

    import android.content.pm.ActivityInfo
    import androidx.appcompat.app.AppCompatActivity
    
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            
            // 根据设备类型设置方向
            if (resources.getBoolean(R.bool.is_tablet)) {
                requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
            } else {
                requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR // 允许所有旋转方向
            }
            
            setContentView(R.layout.activity_main)
        }
    }
    

    Java示例

    import android.content.pm.ActivityInfo;
    import androidx.appcompat.app.AppCompatActivity;
    
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            if (getResources().getBoolean(R.bool.is_tablet)) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
            }
            
            setContentView(R.layout.activity_main);
        }
    }
    

方法2:动态计算屏幕尺寸判断设备

如果不想创建额外的资源文件,可以直接通过屏幕的DP尺寸判断是否为平板:

Kotlin示例

import android.content.pm.ActivityInfo
import androidx.appcompat.app.AppCompatActivity
import android.util.DisplayMetrics

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        if (isTablet()) {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        } else {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
        }
        
        setContentView(R.layout.activity_main)
    }
    
    // 判断是否为平板的工具方法
    private fun isTablet(): Boolean {
        val metrics: DisplayMetrics = resources.displayMetrics
        val widthDp = metrics.widthPixels / metrics.density
        val heightDp = metrics.heightPixels / metrics.density
        val smallestDp = min(widthDp, heightDp)
        return smallestDp >= 600 // 最小宽度≥600dp视为平板
    }
}

方法3:使用Jetpack WindowManager(Android 12+ 现代化方案)

如果你的应用目标版本是Android 12及以上,可以用Jetpack的WindowManager库来更精准地判断设备类型:

  1. 先添加依赖:在build.gradle(Module级别)中添加:

    implementation "androidx.window:window:1.1.0"
    
  2. 在Activity中实现

    import android.content.pm.ActivityInfo
    import androidx.appcompat.app.AppCompatActivity
    import androidx.window.layout.WindowMetricsCalculator
    
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            
            val windowMetrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(this)
            val bounds = windowMetrics.bounds
            val widthDp = bounds.width() / resources.displayMetrics.density
            val heightDp = bounds.height() / resources.displayMetrics.density
            val smallestDp = min(widthDp, heightDp)
            
            if (smallestDp >= 600) {
                requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
            } else {
                requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
            }
            
            setContentView(R.layout.activity_main)
        }
    }
    

额外提示

  • 如果你的应用有多个Activity,建议把这个方向设置逻辑抽成BaseActivity,让所有Activity继承,避免重复代码。
  • SCREEN_ORIENTATION_FULL_SENSOR会允许所有旋转方向(包括反向竖屏/横屏),如果只需要正常的竖屏和横屏,可以换成SCREEN_ORIENTATION_SENSOR

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

火山引擎 最新活动