studio setsupportactionbar example custom bar android media-player android-support-library appcompat android-toolbar

setsupportactionbar - El reproductor de video apaga el modo en Android usando appcompat-v7



toolbar android material design (2)

No estoy seguro de si esto ayudará pero has mirado usando

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

en el método onCreate de tu actividad de video? Puede ser un buen punto de partida. Esto básicamente oculta la barra de estado y hace que mi video esté en pantalla completa.

Este es el diseño que también uso:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/black"> <VideoView android:id="@id/videoSurface" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_centerInParent="true" android:layout_alignParentTop="true" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_gravity="center" /> </RelativeLayout>

Sé que algunos de los parámetros son redundantes, pero al final me da el efecto deseado que quería. ¿Podría ser un buen punto de partida para ti?

Estoy portando una base de código desde Holo nativo ( Theme.Holo etc.) a appcompat-v7 ( Theme.AppCompat etc.). La última sección contiene el tl; dr si no desea leer los detalles.

La cuestión

Todo funciona, pero tuve problemas para replicar un comportamiento que era bastante fácil de usar con el viejo ActionBar. Tengo un reproductor de video, y en el paisaje quiero que se comporte como YouTube: ocultar (animar) los controles del reproductor, la barra de aplicaciones y la barra de estado. En la interacción del usuario, los controles de la interfaz de usuario deben dejar este modo de "luces apagadas" y volver al estado normal. Un temporizador volvería al modo de apagado si el usuario no toca la pantalla durante X segundos. El mismo código que funcionaba con ActionBar no funciona con una Toolbar .

Entonces, lo que estoy usando es:

  • Una barra de estado opaca
  • setSystemUiVisibility() usando uno de estos combos:
    • predeterminado: View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    • se apaga: View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
  • minSdkVersion es 16
  • para mostrar y ocultar el ActionBar simplemente llamé a show() y hide() en él
  • para implementar el mismo comportamiento en la barra de aplicaciones, subclasé la Toolbar y agregué un método show() y hide() que hacía lo mismo (primero simplemente usando setVisibility() , y luego usando animaciones, obteniendo los mismos resultados)

El LAYOUT_STABLE hecho para que la barra de aplicaciones termine detrás de la barra de estado, por supuesto (como implica un fitSystemWindows . Como la barra de aplicaciones es una vista normal en la jerarquía de vistas y no está en la decoración como la barra de acciones, se ve afectada por esa bandera. Esto era lo que estaba viendo en la pantalla:

No aclare de inmediato los límites de la barra de herramientas, ya que la barra de la aplicación está oscura en la oscuridad, pero puede ver que el título está cortado y "desalineado". Esto se debe a que la barra de herramientas tenía el tamaño correcto pero detrás de la barra de estado. Mi problema principal fue en ese punto que no hay una API pública para obtener la altura, el rectángulo o cualquier otra cosa de la barra de estado para mover la barra de la aplicación verticalmente para mostrar debajo de la barra de estado.

Las pruebas se realizaron principalmente en un N5 en LPX13D (última compilación pública de Lollipop en el momento de la redacción), pero lo mismo podría verse en Android 4.4.

La solución hacky

Dicho esto, después de bastante tiempo y algunos intentos fallidos de hacer que funcionara de una forma no demasiado hacky (incluido el intento bastante desesperado de tratar de ponerlo en la decoración), recurrí a esta manera desagradable de hacerlo funcionar :

  1. En onResume :
    a. Llamar a setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE) incluso cuando normalmente no lo haría (paisaje)
    segundo. Registre OnPreDrawListener

  2. En OnPreDrawListener :
    a. Obtenga la vista raíz usando View root = getRootView().findViewById(R.id.my_root)
    segundo. Obtenga la altura de la vista raíz: int rootTop = getAbsoluteViewTop(root) (ver a continuación)
    do. Usa esa parte superior (con la intención de que sea una altura de barra de estado) como un paddingTop para la barra de aplicaciones
    re. Establezca el SystemUiVisibility que usaría normalmente ( LAYOUT_STABLE etc.)
    mi. Suprimir el pase de dibujo

  3. En el siguiente pase de dibujo, OnPreDrawListener el registro de OnPreDrawListener

Este es el método getAbsoluteViewTop() :

private int getAbsoluteViewTop(View view) { int[] location = new int[2]; view.getLocationOnScreen(location); return location[LOCATION_Y]; }

tl; dr y pregunta

tl; dr : no hay forma de hacer un modo apropiado de "luces apagadas" con una Toolbar menos que se empleen hacks hacky.

Pregunta: ¿hay una forma oficial y limpia de implementar este modo de luces apagadas con la Toolbar ?
No pude encontrar nada en los documentos. La barra de estado no es accesible (y todas las formas de averiguar su tamaño que puede encontrar en SO están rotas, para su información). Pero tal vez me estoy perdiendo algo. Me encantaría deshacerme de este truco.


También encontré que los fitssystemwindows no son confiables cuando se quiere que algunos elementos de la jerarquía de vista sean pantalla completa y algunos elementos estén debajo de la barra de estado o de acción. Pero nunca he visto la barra de acciones detrás de la barra de estado. ¿La barra de herramientas está configurada como la barra de acciones de actividad? ¿Estás usando Window.FEATURE_ACTION_BAR_OVERLAY ? De todos modos, si todo lo que necesitas es obtener un número de píxeles para el paddingTop en onResume() , podría ser un poco más limpio (aunque todavía es un hacky) hacer algo como lo siguiente en lugar de utilizar OnPreDrawListener s.

class MyVideoActivity extends Activity { Toolbar bar; //... @Override protected void onResume() { super.onResume(); bar.setPaddingTop(getStatusBarHeight()); } int getStatusBarHeight() { int result = 0; Resources res = getResources(); int resourceId = res.getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = res.getDimensionPixelSize(resourceId); } return result; } }