studio modo manager inmersivo immersive android android-fullscreen

manager - modo inmersivo android 8



El modo inmersivo de navegaciĆ³n se vuelve pegajoso despuĆ©s de presionar el volumen o minimizar-restaurar (3)

El siguiente código funciona para mí:

public void updateUI() { final View decorView = getWindow().getDecorView(); decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { decorView.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); } } }); }

Y llamó al oyente en los métodos onCreate y onResume :

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); updateUI(); } @Override public void onResume() { super.onResume(); updateUI(); }

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { this.getWindow().getDecorView().setSystemUiVisibility(getSystemUiFlags()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } private static int getSystemUiFlags() { return View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; } }

Después del primer comienzo

Después de presionar los botones de volumen o después de presionar dos veces las aplicaciones recientes

Vi que la aplicación QuickPic no tiene este error. Me pregunto cómo lo omitieron.


Mi solución es establecer los indicadores de visibilidad de la interfaz de usuario en tres lugares:

  1. Al obtener el foco
  2. En onResume
  3. En el escucha OnSystemUiVisibilityChangeListener

El tercero solucionó mi problema. Los otros podrían no ser necesarios, pero los dejé. Esto es lo que parece:

private void setupMainWindowDisplayMode() { View decorView = setSystemUiVisilityMode(); decorView.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { setSystemUiVisilityMode(); // Needed to avoid exiting immersive_sticky when keyboard is displayed } }); } private View setSystemUiVisilityMode() { View decorView = getWindow().getDecorView(); int options; options = 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_STICKY; decorView.setSystemUiVisibility(options); return decorView; }

Se llama a setupMainWindowDisplayMode () en onCreate ().


Tuve el mismo problema y lo resolví con una solución simple. A pesar de que no pude encontrar la razón teórica de esta solución, pero funcionó para mí de todos modos.

Parece que cuando se presiona un botón de volumen, las ''banderas'' relacionadas con el ''modo inmersivo'' se borran. Y creo que es por eso que el modo inmersivo está deshabilitado y el modo inmersivo no se restaura automáticamente.

Por lo tanto, traté de establecer las ''banderas'' después de presionar el botón de volumen con el objeto ''ejecutable''.

Entonces, funciona así:

modo inmersivo -> botón de volumen presionado (indicadores borrados) -> 500 ms después, el objeto ejecutable establece los indicadores nuevamente -> modo inmersivo restaurado

1. Primero, defina el objeto ejecutable para establecer las banderas

private Runnable decor_view_settings = new Runnable() { public void run() { 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); } };

2. Publicar el objeto ejecutable con un poco de retraso en un controlador cuando se presiona un botón de volumen

private Handler mHandler = new Handler();

...

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { finish(); } else if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { mHandler.postDelayed(decor_view_settings, 500); } return super.onKeyDown(keyCode, event); }

Lo retrasé 500 ms sin ninguna razón, no es importante.

3. El código básico para el modo inmersivo con objeto ejecutable.

@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(hasFocus) { mHandler.post(decor_view_settings); } }

Funcionó perfectamente en mi aplicación.

Por lo tanto, cuando presiono un botón de volumen, el modo inmersivo se desactiva y aparece el control de volumen.

después de unos segundos, el control de volumen desaparece, al igual que la barra de estado y la barra de navegación.

Espero que este trabajo para usted.