2015-03-21 4 views
5

У меня возникла проблема при использовании режима погружения. Вот код, который я поставил на все виды деятельности:Сброс настроек режима Immersive при изменении активности

@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 и statusBar невидимы, это хорошо.

Проблема в том, что каждый раз, когда я перехожу к другому действию, появляется navigationBar, а затем исчезает. Я бы хотел, чтобы navigationBar не выглядел так.

ответ

3

Если вы invoque этот короткий кода в методе OnCreate деятельности, как в следующем примере:

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

И вы должны вызвать метод на onWindowFocusChanged тоже.

Я надеюсь, что это поможет вам =)

+6

Извините, но ваше решение не устраняет проблему. Панель навигации продолжает появляться и исчезать каждый раз, когда я меняю Activity. – Valentin

3

Самый простой рабочий способ создать базовый класс активности, как следующее:

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

И все мероприятия, которые должны работать в захватывающем режиме должны наследоваться от выше базовый класс.

Я только что протестировал его. Это предотвращает скрытие и отображение экранного меню при изменении активности.

+0

Спасибо за это! Работает хорошо. – squeeish

1

Настоящим решением является называть setSystemUiVisibility как на onResume, так и на onWindowFocusChanged.

@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

Возможно, уже поздно, но прямо сейчас я столкнулся с той же проблемой, что и вы, и наткнулся на это сообщение. К любопытству я нашел решение, которое сработало для меня. Я вручную вызвал функцию «onWindowFocusChanged» и передал «истинный» параметр. Я назвал эту функцию в OnCreate, прежде чем «setContentView (R.layout.activity_main);». Это выполнило функцию и установило режим погружения (полноэкранный режим), прежде чем был добавлен макет, и теперь я не вижу скрытой анимации навигационных и баров состояния. Надеюсь, я помог тебе.

Это код:

@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

Я также столкнулся с этой проблемой. Кажется, что нет способа остановить Android от показа навигационной панели снова после изменения конфигурации.

Что еще хуже, это также не гарантируется, когда именно пользовательский интерфейс системы будет восстановлен. Согласно моим тестам на некоторых устройствах, навигационная панель может появляться даже после того, как были вызваны onWindowFocusChanged и onResume.

Единственный надежный способом я нашел, чтобы предотвратить нежелательный появляясь UI является добавлением isInFullScreenMode булева флага и реализовать View.OnSystemUiVisibilityChangeListener что-то вроде этого:

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

Конечно, иногда при повороте мы можем увидеть, как систему баров быстро появляются и исчезают. Но, по крайней мере, мы можем быть уверены, что состояние пользовательского интерфейса нашего приложения будет надежно восстановлено.

Смежные вопросы