在documentation for the Android manifest中,有多种不同的方式来指定screenOrientation
:
landscape
sensorLandscape
userLandscape
如何指定userLandscape
,但在较旧版本的Android上,请将其回退到sensorLandscape
,即使旧版本也会回归到landscape
?我无法在文档中找到如何执行此操作。
答案 0 :(得分:8)
我不认为有一种方法可以在清单本身中实现回退机制。
我建议您在清单中指定{userLandscape,sensorLandscape,landscape}之一。然后,在运行时检查版本并进行即兴创作。
说,您决定使用清单中的android:screenOrientation="userLandscape"
。
在您的活动onCreate(Bundle)
中,在设置内容之前:
int sdkInt = Build.VERSION.SDK_INT;
// if we're running on some API level within [9, 18), use `sensorLandscape`
if (sdkInt >= Build.VERSION_CODES.GINGERBREAD /* 9 */
&& sdkInt < Build.VERSION_CODES.JELLY_BEAN_MR2 /* 18 */) {
setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
} else if (sdkInt < Build.VERSION_CODES.GINGERBREAD /* 9 */) {
setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
// API 18 or above - handled in manifest
setContentView(R.layout.whatever);
希望有人能提出比这更好的解决方案。这似乎是暴力。
修改强>
尝试了一种不同的方法 - 从我所知道的(我可能在这里错了),userLandscape
,sensorLandscape
之类的枚举不会改变价值观。他们目前的立场是:
<attr name="screenOrientation">
<enum name="unspecified" value="-1" />
<enum name="landscape" value="0" />
<enum name="portrait" value="1" />
<enum name="user" value="2" />
<enum name="behind" value="3" />
<enum name="sensor" value="4" />
<enum name="nosensor" value="5" />
<enum name="sensorLandscape" value="6" />
<enum name="sensorPortrait" value="7" />
<enum name="reverseLandscape" value="8" />
<enum name="reversePortrait" value="9" />
<enum name="fullSensor" value="10" />
<enum name="userLandscape" value="11" />
<enum name="userPortrait" value="12" />
<enum name="fullUser" value="13" />
<enum name="locked" value="14" />
</attr>
因此,如果您要定义integer
,例如:
<!-- `0` for `landscape` -- defined in values/integers.xml -->
<integer name="customScreenOrientation">0</integer>
<!-- `6` for `sensorLandscape` -- defined in values-v9/integers.xml -->
<integer name="customScreenOrientation">6</integer>
<!-- `11` for `userLandscape` -- defined in values-v18/integers.xml -->
<integer name="customScreenOrientation">11</integer>
然后,您可以在活动代码中使用@integer/customScreenOrientation
作为android:screenOrientation
的值。
最好不要说它是一个黑客。如果有人可以确认screenOrientation
的枚举值的稳定状态,这可能是一个可行的解决方法 - 最好包括我之前在多个活动中建议的代码。
另一个编辑:
我之前提到的第二种方法可以改进:
创建3个integers.xml
文件,而不是多个styles.xml
个文件。我想你已经有了一个 - values/styles.xml
。创建values-v9/styles.xml
&amp; values-v18/styles.xml
。
<!-- values/styles.xml -->
<style name="AppTheme" parent="@style/BaseTheme">
<item name="android:screenOrientation">landscape</item>
</style>
<!-- values-v9/styles.xml -->
<style name="AppTheme" parent="@style/BaseTheme">
<item name="android:screenOrientation">sensorLandscape</item>
</style>
<!-- values-v18/styles.xml -->
<style name="AppTheme" parent="@style/BaseTheme">
<item name="android:screenOrientation">userLandscape</item>
</style>
在此之后,创建values/integers.xml
(一个文件)并定义一个整数customScreenOrientation
:
<integer name="customScreenOrientation">?android:attr/screenOrientation</integer>
您的活动代码如下所示:
<activity
....
android:theme="@style/AppTheme"
android:screenOrientation="@integer/customScreenOrientation"/>
这种方法优于第二种方法的优点是我们可以使用枚举代替硬编码值。同样,如果枚举值是一成不变的,这两种方法是等价的。如果他们确实改变了,第二种方法将失败而第三种方法继续进行。