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.
- Cheesesquare: enterAlways produce un diseño incorrecto
- Varios archivos dex definen Landroid / support / v4 / accessibilityservice / AccessibilityServiceInfoCompat
- La función Auto Mirroring for RTL no funciona en las versiones de Android inferiores a 6.0
- Cómo agregar un botón de acción flotante, sin AppCompat?
- AppBar oculta la vista al desplazarse hasta que se colapsa
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:
- Tener una
Activity
lanzador de envoltura que envía inmediatamente de forma programática aActionBarActivity
para versiones de api inferiores. - 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 .
- Cómo crear una barra de herramientas de la tarjeta usando appcompat v7
- Instale el paquete: 'Android Support Library'
- No se puede usar la casilla de verificación en eclipse con el complemento de adt de Android
- Fragmento debe ser una clase pública estática para ser recreado correctamente desde el estado de la instancia
- Biblioteca de soporte de diseño de materiales
- Uso de la biblioteca de soporte de Android 23.2 en build.gradle bloquea la aplicación (XmlPullParserException: XmlPullParserException: vector de etiqueta drawable no válido)
- AppCompatSpinner vs android.widget.Spinner para la aplicación con min SDK versión 14
- ¿Cómo gradle maneja multi módulos con diferentes versiones de la biblioteca de soporte v4?
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);
- Error: Error de ejecución para la tarea ': app: transformClassesWithDexForDebug' en android studio
- ArrayIndexOutOfBoundsException mientras descarta Snackbar / ViewDragHelper