我最近遇到了这个要求,但不想使用这些解决方案中的任何一个。它们都有一个共同点,就是以编程方式调用setRequestedOrientation。这样做的问题是它设置的方向太晚并导致轻微的 UI 故障。如果您的设备在您启动应用程序时处于横向状态,它会以横向方式加载然后旋转。如果您使用主题创建闪屏效果,这一点尤其明显,因为您会看到背景图像的方向错误。这也可能对您的应用在最近的应用中的显示方式以及其他答案 cmets 中指出的配置更改问题产生副作用。
结论需要在清单中设置正确的方向,以便系统在不启动您的应用的情况下知道方向。
这里有一个解决方法(虽然很费力,但你会睡得更好)
首先将清单中的方向设置为占位符
<activity
android:screenOrientation="${screenOrientation}"
...
</activity>
然后我们需要添加一个 normal/tablet 风格来设置 app/build.gradle 中的值。 (如果您已经在使用风味,可以使用新的构建类型来实现)
android {
...
productFlavors {
normal {
manifestPlaceholders = [screenOrientation: "portrait"]
}
tablet {
manifestPlaceholders = [screenOrientation: "unspecified"]
}
}
}
现在我们需要告诉平板电脑版本它仅适用于大型设备。这可以通过添加仅平板电脑清单与默认清单合并来完成。在 ->
处添加一个新的清单文件
app
src
tablet
AndroidManifest.xml
下面是这个manifest需要的所有东西,因为它与默认的合并是->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="{package}">
<supports-screens
android:smallScreens="false"
android:normalScreens="false"
android:largeScreens="true"
android:xlargeScreens="true"
android:requiresSmallestWidthDp="600"
/>
</manifest>
最后一个技巧是我们需要按版本代码区分构建,因为 Playstore 不能有两个具有匹配代码的上传。我们要确保平板电脑(更严格的构建)具有更高的代码。一种简单的方法是获取基本代码,然后用于平板电脑base * 2 和普通base * 2 - 1。我为此使用 CI,基本代码是内部版本号,但很容易按照您的喜好进行硬编码。
现在构建两种口味来创建
app-normal.apk/aab (v1.0.0, version code 1)
app-tablet.apk/aab (v1.0.0, version code 2)
将它们作为多个 apk/aab 上传上传到 Playstore,然后如果在平板电脑上下载,Playstore 会为他们提供旋转的 apk,如果在手机上下载,则只有一个肖像。
注意:仅在通过 Google Playstore/Amazon Kindle 分发时有效
延伸阅读https://developer.android.com/google/play/publishing/multiple-apks
https://developer.amazon.com/docs/fire-tablets/ft-screen-layout-and-resolution.html