studio rotate how configchanges change android android-activity orientation screen-orientation android-orientation

rotate - android:configchanges



¿Por qué `android: screenOrientation=“ behind ”` no tiene efecto en Android 4.1.2? (1)

Como muestra de prueba está la aplicación con 2 actividades: MainActivity que inicia SecondActivity al hacer clic en el botón. Funciona bien en Android 4.0.4, pero en Android 4.1.2 me encontré con un comportamiento inesperado.

La Autorrotación en la configuración del sistema está desactivada (o está activada, no importa, la opción "atrás" se ignora de todos modos). android:screenOrientation="landscape" está configurado para MainActivity, y android:screenOrientation="behind" está configurado para SecondActivity, lo que significa que SecondActivity también debe lanzarse en orientación horizontal. Es cierto para Android 4.0.4, pero en Android 4.1.2 SecondActivity comienza con orientación vertical.

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); }

Registre la salida sin android:configChanges="screenSize|orientation" línea en AndroidManifest.xml para SecondActivity después de hacer clic en el botón 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

Inicie sesión con la línea android:configChanges="screenSize|orientation" incluido en AndroidManifest.xml:

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

No hay actividad de recreación ahora, pero el resultado es siempre el mismo: ¡SecondActivity está comenzando con orientación vertical! :( Es decir, SecondActivity gira al retrato después de onResume por alguna razón. ¿Por qué? ..

Probado en:

  • Samsung Galaxy S3 con Android 4.0.4 (Ok)
  • Samsung Galaxy S3 con Android 4.1. (Insecto)
  • Emulador con Android 4.1.2 con orientación de pantalla de inicio vertical (Bug)
  • Emulador de Android 4.0.3 (Ok)
  • Emulador de Android 4.2 (Bug)

android:targetSdkVersion="16"

Elimine esta declaración en su archivo de manifiesto, porque SDKVersion = 16 solo está disponible para v4.0.