为什么180度旋转屏幕不算作配置更改?

时间:2017-01-27 16:28:07

标签: android android-activity camera android-camera

为什么将屏幕快速旋转180度不算作配置更改,因此它不会触发Activity.onCreate()!所以我无法调整我的相机视图!如果旋转90度,则每次触发配置更改。 我省略了源代码,因为我的清单中没有configChanges也没有orientation属性。活动也没什么特别的。这似乎是一种预期的行为,但我找不到任何官方信息。

设备:硬件Nexus 5X

平台:Android 7.1.1

清单:

<supports-screens
    android:anyDensity="true"
    android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="false"
    android:xlargeScreens="true" />

<application
    android:name="xyz.MyApp"
    android:allowBackup="true"
    android:backupAgent=".provider.MyBackupAgent"
    android:hardwareAccelerated="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:restoreAnyVersion="true"
    android:theme="@style/AppTheme"
    android:uiOptions="splitActionBarWhenNarrow"
    tools:replace="android:icon" >

<activity android:name="xyz.MyActivity"
        android:label="asdf"
        android:theme="@style/Theme" />

styles.xml:

<style name="Theme" parent="Theme.AppCompat.NoActionBar">
    <item name="actionBarIconColor">#fff</item>
    <item name="actionBarInsetStart">@dimen/keyline_2</item>
</style>

样式-v19.xml:

<style name="Theme" parent="Theme.AppCompat.NoActionBar">
    <item name="actionBarIconColor">#fff</item>
    <item name="actionBarInsetStart">@dimen/keyline_2</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
</style>

2 个答案:

答案 0 :(得分:3)

您应在android:screenOrientation="fullSensor"为您的活动指定AndroidManifest.xml 如上所述,here默认方向为sensor,忽略了反向纵向方向。 fullSensor允许所有4个方向

更新:上述答案无法解决问题。核心问题是将方向改变180度(即从横向到反向横向)不会触发重建活动。这是预期的行为。通常情况下,横向布局与反向横向布局没有区别。 如果您想在旋转180后更改部分视图,可以使用OrientationEventListener

样品:

final WindowManager mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

OrientationEventListener orientationEventListener = new OrientationEventListener(this,
                SensorManager.SENSOR_DELAY_NORMAL) {
            @Override
            public void onOrientationChanged(int orientation) {
                if (orientation == ORIENTATION_UNKNOWN) {
                    return;
                }
                Display display = mWindowManager.getDefaultDisplay();
                int rotation = display.getRotation();
                if (rotation != mLastRotation) {
                    // do something with your views
                    mLastRotation = rotation;
                }
            }
        };

 if (orientationEventListener.canDetectOrientation()) {
     orientationEventListener.enable();
 }

如果你的minSdk是17岁以上,你也可以使用DisplayListener#onDisplayChanged回调

答案 1 :(得分:0)

请在AndroidManifest文件中使用它:

android:screenOrientation="sensorLandscape"