La barra de acciones se muestra incorrectamente al volver del modo inmersivo

Tengo algunos problemas al regresar de Immersive Mode en ActionBarActivity . He creado una aplicación sencilla para ilustrar este problema. Hay un diseño con un solo botón para cambiar el modo inmersivo. Cuando "regresa" desde el modo inmersivo, la barra de acción está desplazada hacia abajo desde su posición original, aproximadamente a la misma distancia que normalmente se desplaza desde la parte superior de la pantalla.

He intentado esto en un Nexus 4 Lollipop corriendo. Este comportamiento no ocurrió antes de Lollipop.

Capturas de pantalla antes , inmerso , después .

Una ActionBarActivity sencilla que ilustra este problema:

 public class MainActivity extends ActionBarActivity { private boolean immersed; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @TargetApi(Build.VERSION_CODES.KITKAT) private void enterImmersiveMode() { if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY ); immersed = true; } } @TargetApi(Build.VERSION_CODES.KITKAT) private void leaveImmersiveMode() { if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); immersed = false; // recreate(); } } public void toggleImmersive(View v) { if (immersed) { leaveImmersiveMode(); } else { enterImmersiveMode(); } } } 

Nada de lujos en el manifiesto:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.immersivetest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="ImmersiveTest" android:theme="@style/Theme.AppCompat" > <activity android:name=".MainActivity" android:label="ImmersiveTest" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

Diseño triviales:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.immersivetest.MainActivity" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="toggle immersive" android:onClick="toggleImmersive" /> </RelativeLayout> 

La solución que utilizo en este momento es llamar a recreate() después de salir del modo inmersivo, pero parece un poco "glitchy".

Si minSdkVersion el minSdkVersion y uso la Activity vez de ActionBarActivity , es decir no utilizo la biblioteca de la ayuda, entonces no experimento este comportamiento.

Entiendo que el modo de inmersión sólo está disponible en KitKat + y que no necesito usar la ActionBarActivity de la biblioteca de soporte, pero el producto terminado tendrá que ejecutarse en versiones de api 8+ y el modo de inmersión es un extra opcional.

Algunas otras soluciones que he pensado y desechado por ahora:

  1. Tener una Activity lanzador de envoltura que envía inmediatamente de forma programática a ActionBarActivity para versiones de api inferiores.
  2. Tiene múltiples apks por la versión de api.

Cualquiera de esas opciones suena como un montón de mantenimiento añadido.

¿Hay algo más que pueda probar? ¿Hay algún error flagrante en el código anterior, con respecto al regreso del modo inmersivo?

Actualizar

Desde entonces he actualizado el Nexus 4 a 5.1 y la biblioteca de soporte a rev 22.1.1 y el comportamiento sigue siendo el mismo. También he actualizado el código para usar la nueva AppCompatActivity ya que ActionBarActivity está ahora obsoleto. El comportamiento es, una vez más, el mismo.

 public class MainActivity extends AppCompatActivity { // no changes here } 

Actualizar

Este comportamiento extraño también se extiende al modo horizontal. Además del desplazamiento en la parte superior de la pantalla, también hay un desplazamiento a la derecha de la pantalla entre el final de la barra de acción y los botones de navegación. Curiosamente este desplazamiento de nuevo parece ser el tamaño del botón de navegación "barra", es decir, más grande que el desplazamiento en la parte superior.

Paisaje capturas de pantalla antes , inmerso , después .

Utilizar una barra de herramientas … Tuve el mismo problema y cambiar a una barra de herramientas en lugar de un customContentView resuelto.

  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); 

Y establezca el tema de su actividad en @ style / Theme.AppCompat.NoActionBar

Tenía el mismo problema, arreglado con esto: su función leaveImmersiveMode() debería usar estos indicadores en su lugar:

 getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN); 
  • Android Recycle View LogCat: No se pudo encontrar el método
  • Appcompat-v7: 21.0.0 ': No se encontró ningún recurso que coincida con el nombre dado: attr' android: actionModeShareDrawable '
  • El desplazamiento automático se produce cuando Horizontal RecyclerView se coloca como un elemento en un RecyclerView vertical
  • AS no puede encontrar BottomSheetBehavior_Params, _behavior_peekHeight y _behavior_hideable
  • Android - setStatusBarColor () NoSuchMethodError excepción
  • Barra de herramientas Sugerencias de búsqueda
  • Cómo deshabilitar "expandir" de AppBarLayout en el fragmento que tiene un NestedScrollView?
  • ¿Es posible hacer que CursorAdapter se establezca en recycleview, al igual que ListView?
  • Android Studio exporta cadenas de la biblioteca de soporte a APK
  • La instalación de la biblioteca com: android: support: percent: 22.2.1 falla en Android Studio
  • AppCompatDrawableManager.get () vs VectorDrawableCompat.create ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.