11

Inizialmente ho impostato la mia attività di essere in modalità immersiva con il seguente codice:barra di stato appare quando viene visualizzata la tastiera morbida ma non nascosto indietro quando tastiera virtuale scompare, mentre in modalità immersiva

View decorView = getWindow().getDecorView(); 
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); 

Tutto funziona bene fino a quando l'utente clicca su EditText e appare la tastiera virtuale. Fa sì che la barra di stato si attacchi in alto e non si nasconda mai più indietro anche dopo che la tastiera virtuale scompare. Stranamente, ho riscontrato questo problema solo sui telefoni LG/Samsung, i telefoni Sony non hanno alcun problema con questo. Qualcuno ha qualche idea su questo?

+0

hai trovato qualche soluzione? – user18853

+4

Sì :) a quanto pare ho bisogno di aggiungere true per l'xml della mia attività –

+0

@AndriantoLie Il tuo commento è corretto. Per favore aggiungilo come risposta e accettalo per i futuri lettori. –

risposta

5

Utilizzare la modalità immersiva come questa.

@Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 
     immersiveMode(); 
     getWindow().getDecorView().setOnSystemUiVisibilityChangeListener 
      (new View.OnSystemUiVisibilityChangeListener() { 
       @Override 
       public void onSystemUiVisibilityChange(int visibility) { 
        immersiveMode(); 
       } 
      }); 
    } 

Ecco la funzione della modalità immersiva.

public void immersiveMode() { 
     final View decorView = getWindow().getDecorView(); 
     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); 
       } 

chiamare anche immersiveMode() in onResume(); Ora la barra di stato scompare quando la tastiera del tasto software scompare.

+3

Fondamentalmente corretto, ma un po 'eccessivo: 1) Basta aggiungere l'ascoltatore nel tuo onCreate(), non è necessario continuare ad aggiungerlo; 2) devi solo chiamare immersiveMode() se visibilità> 0 –

0

Ecco la mia soluzione per questo; In primo luogo ho controllato se la tastiera molle è fatto vivo oppure no:

getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 

      Rect r = new Rect(); 
      getWindow().getDecorView().getWindowVisibleDisplayFrame(r); 
      int screenHeight = getWindow().getDecorView().getRootView().getHeight(); 

      int keypadHeight = screenHeight - r.bottom; 

      //Log.d(TAG, "keypadHeight = " + keypadHeight); 

      if (keypadHeight > screenHeight * 0.15) { 
       //Keyboard is opened 
       hideNavBar(); 
      } 
      else { 
       // keyboard is closed 
      } 
     } 
    }); 

e ho un metodo di hideNavBar() per essere attivato quando la tastiera è morbida si presentò.

private void hideNavBar() { 
if (Build.VERSION.SDK_INT >= 19) { 
    View v = getWindow().getDecorView(); 
    v.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); 
} 

}

Questo risolve il problema di ottenere barra di navigazione, mentre v'è un EditText essere digitato.

Problemi correlati