La navigazione in modalità immersiva diventa appiccicosa dopo la pressione del volume o riducendo al minimo il ripristino

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; } } 

Dopo il primo inizio

Dopo il primo inizio

  • Buggy ListView mi fa triste
  • Android Spinner - onItemSelected / setOnItemSelectedListener che non viene triggersto
  • URLEncodedUtils deprecato in Android
  • Gioca il video m3u8 in android
  • Keychain Android per credenziali utente
  • Buona soluzione per mantenere gli elementi di listview quando l'utente ruota il telefono e tiene tutti i dati in ArrayAdapter
  • Dopo aver premuto i pulsanti di volume o dopo due volte le applicazioni recenti, premere due volte

    immettere qui la descrizione dell'immagine

    Ho visto QuickPic app non ha questo bug. Mi chiedo come abbiano omesso.

  • Come rimuovere un elemento selezionato da ListView utilizzando CursorAdapter
  • Android - Actionbar Sherlock - Filtro di ricerca
  • Android Zxing cambia orientamento al ritratto
  • Ottieni diretta Vimeo video url Android
  • Calcolo della distanza tra due posizioni geografiche
  • Qualsiasi modo di comunicare con WebView in Android?
  • 3 Solutions collect form web for “La navigazione in modalità immersiva diventa appiccicosa dopo la pressione del volume o riducendo al minimo il ripristino”

    come per me, uso questo codice

     public void UiChangeListener() { 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); } } }); } 

    e lo chiamò su onCreate. 🙂

    Ho avuto lo stesso problema, e ho risolto con una semplice soluzione. Anche se non riuscivo a trovare la ragione teorica di questa soluzione, ma funzionava comunque per me.

    Sembra che quando si preme un button di volume, le 'bandiere' relative alla modalità 'immersiva' vengono cancellate. E penso sia per questo che la modalità immersiva è disabilitata e la modalità immersiva non viene ripristinata automaticamente.

    Pertanto, ho cercato di impostare le 'bandiere' dopo aver premuto il button del volume con l'object 'runnable'.

    Quindi, funziona così:

    modalità immersiva -> button volume premuto (flag cancellato) -> 500 ms più tardi, l'object runnable reimposta le bandiere -> modalità immersiva ripristinata

    1. In primo luogo, definire l'object runnable per impostare le flag

     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. Inserire l'object runnable con un certo ritardo a un gestore quando si preme un button di volume

     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); } 

    Ho appena ritardato per 500 ms senza motivo, non è importnte.

    3. Il codice base per la modalità immersiva con object runnable

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

    Ha funzionato perfettamente sulla mia applicazione.

    Quindi, quando premendo un button del volume, la modalità immersiva viene disabilitata e il rocker di volume si apre.

    dopo alcuni secondi, il rocker di volume scompare e così anche la barra di stato e la barra di navigazione.

    Spero che questo lavoro per te.

    La mia soluzione è impostare i flag di visibilità UI in tre punti:

    1. Quando si ottiene il fuoco
    2. In onResume
    3. Nel listener OnSystemUiVisibilityChangeListener

    Il terzo ha risolto il mio problema. Gli altri potrebbero non essere necessari, ma li ho lasciati. Questo è quello che sembra:

      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; } 

    setupMainWindowDisplayMode () viene richiamato in onCreate ().

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.