Почему "android: screenOrientation =" позади "` no effect в android 4.1.2? - программирование
Подтвердить что ты не робот

Почему "android: screenOrientation =" позади "` no effect в android 4.1.2?

В качестве тестового примера есть приложение с двумя действиями: MainActivity, которое запускает SecondActivity при нажатии кнопки. Он отлично работает на Android 4.0.4, но на Android 4.1.2 я столкнулся с неожиданным поведением.

Автоопределение в системных настройках выключено (или включено - это не имеет значения, опция "позади" в любом случае игнорируется). android:screenOrientation="landscape" установлен для MainActivity, а android:screenOrientation="behind" - для SecondActivity, что означает, что SecondActivity также должен быть запущен в альбомной ориентации. Это верно для Android 4.0.4, но на Android 4.1.2 SecondActivity начинается с портретной ориентации.

AndroidManifest.xml:

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="16" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.my.example.testbehindorientation.MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="landscape" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.my.example.testbehindorientation.SecondActivity"
        android:configChanges="screenSize|orientation"
        android:label="@string/title_activity_second"
        android:screenOrientation="behind" >
    </activity>
</application>

SecondActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    logOrientation("onCreate");
}


@Override
protected void onDestroy() {
    super.onDestroy();
    logOrientation("onDestroy");
}

@Override
protected void onResume() {
    super.onResume();
    logOrientation("onResume");
}

private void logOrientation(String prefix) {
        int requestedOrientation = this.getRequestedOrientation();
        WindowManager lWindowManager =  (WindowManager) getSystemService(WINDOW_SERVICE);
        Configuration cfg = getResources().getConfiguration();
        int lRotation = lWindowManager.getDefaultDisplay().getRotation();   
        int orientation = cfg.orientation;
        Log.i(LOG_TAG, prefix + ", requestedOrientation is " + requestedOrientation + ", rotation is " + lRotation + ", orientation is " + orientation);
}

Выход журнала без android:configChanges="screenSize|orientation" в AndroidManifest.xml для SecondActivity после нажатия кнопки в MainActivity:

onCreate, requestedOrientation is 3, rotation is 1, orientation is 2
onResume, requestedOrientation is 3, rotation is 1, orientation is 2
onDestroy, requestedOrientation is 3, rotation is 0, orientation is 1
onCreate, requestedOrientation is 3, rotation is 0, orientation is 1
onResume, requestedOrientation is 3, rotation is 0, orientation is 1

Записать строку android:configChanges="screenSize|orientation", включенную в AndroidManifest.xml:

onCreate, requestedOrientation is 3, rotation is 1, orientation is 2
onResume, requestedOrientation is 3, rotation is 1, orientation is 2

Нет активного отдыха, но результат всегда один и тот же - SecondActivity начинается с портретной ориентации!:( То есть, SecondActivity по какой-то причине поворачивается к портрету после onResume. Почему?..

Протестировано:

  • Samsung Galaxy S3 с Android 4.0.4 (Ok)
  • Samsung Galaxy S3 с Android 4.1.? (Ошибка)
  • Эмулятор с Android 4.1.2 с ориентацией на начальном экране портрета (ошибка)
  • эмулятор Android 4.0.3 (Ok)
  • Android 4.2 эмулятор (ошибка)
4b9b3361

Ответ 1

Android: targetSdkVersion = "16"

Удалите этот элемент в файле манифеста, becoz SDKVersion = 16 способен только для v4.0