Detectar cuando los botones del sistema son visibles mientras se usa 'modo inmersivo'
Actualmente utilizo el modo de inmersión (API 19) para una de mis actividades como sigue:
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 | View.INVISIBLE);
Esto oculta los botones del sistema y la barra de notificación hasta que el usuario vuelva a apagarlos. Esto funciona bien, sin embargo deseo detectar cuando el usuario vuelve a hacer los botones visibles. He intentado un OnSystemUiVisibilityChangeListener
pero no se OnSystemUiVisibilityChangeListener
para este evento en particular.
- ¿Cuál es la diferencia entre Dalvik VM y ART Runtime?
- Uso del Kit Kat DatePicker en el dispositivo Lolipop
- Recortar al seleccionar de Galería en Android 4.4
- Ejecutar un tarro multidex independiente en Android Kitkat
- API de Valoración de KitKat de Android 4.4
¿Algunas ideas?
- Navegación incorrecta al guardar contactos en Android
- Cómo encontrar bluetooth mac dirección de forma programática en Android api nivel 19
- Cómo grabar pantalla y tomar capturas de pantalla, utilizando la API de Android?
- Android ActionBar transparente con ActionSherlock en v19
- Obtener el camino real de URI, KitKat Android nuevo marco de acceso de almacenamiento
- Excepción fatal: error desconocido (código 14) no se pudo abrir la base de datos
- ¿Cómo ignorar los cambios de configuración del tamaño de fuente para Cordova App cuando se ejecuta en Android 4.4 o superior?
- El caché de WebView no funciona en Android 4.4
Desde el vídeo de desarrolladores de Android, cuando estás en un modo de inmersión, la aplicación no se notifica.
El modo pegajoso inmersivo empieza a las 6:56 y alrededor de las 7:25 Roman Nurik dice que el oyente no se disparará.
Este es el video: http://youtu.be/cBi8fjv90E4?t=6m56s
RESPUESTA ACTUALIZADA:
Establezca OnSystemUiVisibilityChangeListener, forzar el modo inmersivo cuando la visibilidad es 0 (en lugar de 6).
if(android.os.Build.VERSION.SDK_INT >= 19) { getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if(visibility == 0) { 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); } } }); }
ANTIGUO, DESAGRADABLE RESPUESTA:
Esto es desagradable, pero es una solución IFF que estaba mostrando un ActionBar:
- Agregue un OnGlobalLayoutListener al ViewTreeObserver de 'action_bar_container'.
- En la implementación de OnGlobalLayoutListener, compruebe si la visibilidad 'action_bar_container' es GONE o no.
- Cuando se trasladó de GONE a! GONE (y suponiendo que estuviera en modo inmersivo), entonces la fuerza de inmersión modo de nuevo a través del método setSystemUiVisibility.
if(android.os.Build.VERSION.SDK_INT >= 19) { int actionBarContainerId = Resources.getSystem().getIdentifier("action_bar_container", "id", "android"); ((ViewGroup)findViewById(actionBarContainerId)).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int actionBarContainerId = Resources.getSystem().getIdentifier("action_bar_container", "id", "android"); ViewGroup actionBarContainer = (ViewGroup) findViewById(actionBarContainerId); if(actionBarContainer.getVisibility() == View.GONE) { if(DEBUG) Log.d(TAG, "...PROBABLY IN IMMERSIVE MODE AND ALL IS GOOD!.."); } else { if(DEBUG) Log.d(TAG, "...PROBABLY NO LONGER IN IMMERSIVE MODE, HEY.."); 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); } } }); }
He encontrado una solución que me conviene aunque no sea perfecta. Establecer la visibilidad de la interfaz de usuario a View.SYSTEM_UI_FLAG_IMMERSIVE
lugar de View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
y cuando recibo la onSystemUiVisibilityChange
llamada onSystemUiVisibilityChange
, retraso un mensaje a un controlador para restablecer la visibilidad de la interfaz de usuario. Aquí está el código:
private static final int FULL_SREEN_MSG = 10; private static final long TIME_BEFORE_HIDE_UI = 2 * DateUtils.SECOND_IN_MILLIS; private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == FULL_SREEN_MSG) { setFullscreen(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setFullscreen(); getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(this); } private void setFullscreen() { 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 // hide nav bar | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | View.SYSTEM_UI_FLAG_IMMERSIVE); } @Override public void onSystemUiVisibilityChange(int visibility) { if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { mHandler.sendEmptyMessageDelayed(FULL_SREEN_MSG, TIME_BEFORE_HIDE_UI); } }
En 4.4, la aplicación no recibirá ninguna indicación cuando las barras del sistema transitorio se revelan o se ocultan automáticamente (bajo IMMERSIVE_STICKY), ya sea a través de OnSystemUiVisibilityChangeListener u otros medios.
Usted puede escuchar swipes de borde similar al oyente gesture system como una suposición, pero esto no es parte de la api pública, puede cambiar en versiones futuras y difieren entre dispositivos.
Tengo curiosidad por lo que quieres hacer cuando se muestren / oculten las barras del sistema transitorio.
- Conversión de datos YUV de la cámara en ARGB con renderscript
- Android: ¿Hay dispositivos de densidad xxxhdpi?