2015-03-21 14 views
5

Mam do czynienia z problemem podczas korzystania z trybu immersyjnego. Oto kod I umieścić na wszystkich działań:Resetowanie w trybie w trybie Android podczas zmiany aktywności

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus) { 
     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 
     ); 
    } 
} 

navigationBar i statusBar są niewidoczne, to jest dobre.

Problem polega na tym, że za każdym razem, gdy przechodzę do innej czynności, pojawia się navigationBar, a następnie znika. Chciałbym, żeby navigationBar nie wyglądało tak.

Odpowiedz

3

Jeśli invoque ten krótki kod w metodzie onCreate aktywności jak następnym przykładzie:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
      hideSystemUI(); 
      ... 
    } 

// This snippet hides the system bars. 
    private void hideSystemUI() { 
     // Set the IMMERSIVE flag. 
     // Set the content to appear under the system bars so that the content 
     // doesn't resize when the system bars hide and show. 
     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); 
    } 

A należy wywołać metodę na onWindowFocusChanged też.

Mam nadzieję, że to pomoże Ci =)

+6

Niestety, twoje rozwiązanie nie rozwiązuje problemu. Pasek nawigacji nadal się pojawia i znika za każdym razem, gdy zmienię działanie. – Valentin

3

Najprostszym sposobem pracy jest stworzenie klasy Activity Base jak następuje:

public abstract class BaseActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     enableImmersiveMode(); 
    } 

    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 

     if(hasFocus) { 
      enableImmersiveMode(); 
     } 
    } 

    protected void enableImmersiveMode() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      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 
      ); 
     } 
    } 
} 

A wszystkie działania, które powinny pracować w trybie wciągającej powinien dziedziczyć z góry klasa podstawowa.

Właśnie to przetestowałem. Zapobiega ukrywaniu się i ukrywaniu menu ekranowego podczas zmiany czynności.

+0

Dzięki za to! Działa dobrze. – squeeish

1

Prawdziwym rozwiązaniem jest zadzwonić pod numer setSystemUiVisibility zarówno pod numer onResume, jak i pod numer .

@Override 
protected void onResume() { 
    super.onResume(); 
    hide(); 
} 

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    hide(); 
} 

public void hide() { 
    getWindow().getDecorView().setSystemUiVisibility(
      View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | 
      View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | 
      View.SYSTEM_UI_FLAG_FULLSCREEN | 
      View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | 
      View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | 
      View.SYSTEM_UI_FLAG_LAYOUT_STABLE);   
} 
2

Może jest już późno, ale w tej chwili stanąłem w obliczu tego samego problemu co ty i natknąłem się na ten post. Z ciekawości znalazłem rozwiązanie, które zadziałało dla mnie. Ręcznie wywołałem funkcję "onWindowFocusChanged" i przekazałem "prawdziwy" parametr. Nazwałem tę funkcję w OnCreate, przed "setContentView (R.layout.activity_main);". To wykonało funkcję i ustawiło tryb immersyjny (pełny ekran), zanim dodano układ, a teraz nie widzę ukrywania animacji paska nawigacji i stanu. Mam nadzieję, że ci pomogłem.

Jest to kod:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    onWindowFocusChanged(true); 
    setContentView(R.layout.activity_main); 
} 

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus) { 
     getWindow().getDecorView().setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
         | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
         | View.SYSTEM_UI_FLAG_FULLSCREEN 
         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);} 
} 
0

Byłem też do czynienia z tym problemem. Wygląda na to, że nie można zatrzymać Androida po ponownym wyświetleniu paska nawigacyjnego po zmianie konfiguracji.

Co gorsza, nie można zagwarantować, że dokładnie systemowy interfejs użytkownika zostanie przywrócony. Według moich testów na niektórych urządzeniach pasek nawigacyjny może pojawić się ponownie po wywołaniu onWindowFocusChanged i onResume.

Jedynym niezawodnym sposobem znalazłem, aby zapobiec niepożądanemu UI pojawiając jest dodanie isInFullScreenMode logiczną flagi i wdrożenie View.OnSystemUiVisibilityChangeListener coś takiego:

@Override 
public void onSystemBarsVisible() { 
    if (isInFullScreenMode) { 
     // If Android presented system bars 
     // but our app doesn't need them at this point 
     // just call hideSystemUi() again 
     hideSystemUi(); 
     return; 
    } 
} 

@Override 
public void onSystemBarsHidden() { 
    if (!isInFullScreenMode) { 
     // Similar technique as shown above 
     showSystemUi(); 
     return; 
    } 
} 

oczywiście, czasami na obrót możemy zobaczyć jak bary systemowych szybko pojawiają się i znikają. Ale przynajmniej możemy być pewni, że stan interfejsu naszej aplikacji zostanie rzetelnie przywrócony.

Powiązane problemy