11

Początkowo mogę ustawić aktywny być w trybie Immersive z następującego kodu:Pasek stanu pojawia się, gdy pojawia się klawiatura ale nie ukryte z powrotem, gdy klawiatura znika natomiast w trybie Immersive

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

wszystko działa dobrze, dopóki użytkownik klika na EditText i pojawia się klawiatura ekranowa. Powoduje, że pasek stanu trzyma się na górze i nigdy nie chowa się ponownie, nawet po zniknięciu miękkiej klawiatury. O dziwo, mam ten problem tylko na telefonach LG/Samsung, telefony Sony nie mają z tym żadnego problemu. Ktoś ma jakiś pomysł na ten temat?

+0

znalazłeś jakieś rozwiązanie? – user18853

+4

Tak :) najwyraźniej muszę dodać true do xml mojej działalności –

+0

@AndriantoLie Twój komentarz jest poprawny. Dodaj go jako odpowiedź i zaakceptuj dla przyszłych czytelników. –

Odpowiedz

5

Użyj tego trybu immersyjnego.

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

Oto Twoja funkcja trybu immersyjnego.

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

nazwać również immersiveMode() w OnResume(); Teraz pasek stanu zniknie, gdy zniknie twoja tablica z przyciskami.

+3

Zasadniczo poprawne, ale trochę przesadzone: 1) Po prostu dodaj słuchacza w swoim onCreate(), nie musisz go ciągle dodawać; 2) wystarczy wywołać immersiveMode(), jeśli widoczność> 0 –

0

Oto moje rozwiązanie tego; Najpierw sprawdził, czy klawiatura jest pokazała się czy nie:

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

i mam metoda hideNavBar(), aby być wyzwalane, gdy klawiatura jest pokazał.

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

}

To rozwiązuje problem coraz pasek nawigacji podczas gdy istnieje EditText być wpisane.

Powiązane problemy