Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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.

¿Algunas ideas?

  • Cómo configurar el SMS predeterminado para KitKat
  • Bluetooth HCI snoop registro no generado
  • Las longitudes incorrectas del arreglo, el encargado de la notificación causan el choque del teléfono en 4.4
  • Cómo hacer transparente la barra de navegación
  • El caché de WebView no funciona en Android 4.4
  • Lost appCache de Android 4.4 WebView
  • ¿Cómo notificar correctamente a MediaScanner sobre una carpeta, incluso en dispositivos Nexus / Kitkat?
  • Marcación de mensajes SMS como mensajes de lectura / no leídos o eliminación de mensajes que no funcionan en KitKat
  • 4 Solutions collect form web for “Detectar cuando los botones del sistema son visibles mientras se usa 'modo inmersivo'”

    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.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.