2016-06-14 11 views
1

Я искал везде, но я в недоумении об этом: попытка активировать режим погружения в проекте; Почти все работает нормально, за исключением того, что фон моей строки состояния всегда остается там, испортил погружение ... Я включил скриншот экрана до и после активации режима погружения и установил «colorPrimaryDark» на полный зеленый цвет для максимальная контрастность: screenshots showing the background of the status bar when nothing should be there кода я использовал и повторно в пустом проекте, чтобы изолировать эту проблему приходит прямо из примеров Дева Google, в моем MainActivity, у меня есть:Статус строки фона остается на экране при входе в режим погружения?

private final String TAG = "DEBUG::" + this.getClass().getSimpleName(); 
private final int INITIAL_HIDE_DELAY = 1500; 
private View decorView; 
private Toolbar toolbar; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    //setting needed decorView for fullscreen behavior 
    decorView = getWindow().getDecorView(); 
    decorView.setOnSystemUiVisibilityChangeListener(onSystemUiVisibilityChangeListener); 
} 
@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    Log.i(TAG, "onWindowFocusChanged::hasFocus = " + hasFocus); 
    if (hasFocus) {// When the window gains focus, hide the system UI. 
     delayedHide(INITIAL_HIDE_DELAY); 
    } else {// When the window loses focus, cancel any pending hide action. 
     mHideHandler.removeMessages(0); 
    } 
} 

private void hideSystemUI() { 
    Log.i(TAG, "hideSystemUI"); 
    int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE; 
    uiOptions |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; 
    uiOptions |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; 
    uiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
    uiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN; 
    uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE; 
    uiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE; 
    decorView.setSystemUiVisibility(uiOptions); 
} 
private final Handler mHideHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     hideSystemUI(); 
    } 
}; 

private void delayedHide(int delayMillis) { 
    Log.i(TAG, "delayedHide"); 
    mHideHandler.removeMessages(0); 
    mHideHandler.sendEmptyMessageDelayed(0, delayMillis); 
} 

private View.OnSystemUiVisibilityChangeListener onSystemUiVisibilityChangeListener = 
     new View.OnSystemUiVisibilityChangeListener() { 
      @Override 
      public void onSystemUiVisibilityChange(int visibility) { 
       if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 
        // The system bars are visible 
        getSupportActionBar().show(); 
        delayedHide(INITIAL_HIDE_DELAY); 
       } else { 
        // The system bars are NOT visible 
        getSupportActionBar().hide(); 
       } 
      } 
     }; 

Интересно, если моя проблема может исходить от макеты или файлы стилей, но они являются необработанными от генерации проекта ... Я надеюсь, что кто-то там может указать мне, где я потерпел неудачу! Спасибо заранее!

EDIT: Я обнаружил, что удаление: android:fitsSystemWindows="true" из файла макета моей деятельности позволяет реальный полноэкранный режим, но тогда мой ActionBar частично скрыт за StatusBar - при показе. Может быть, когда я установил getSupportActionBar().show(); в onSystemUiVisibilityChangeListener, он будет нарисован слишком рано?

EDIT 2: Как я понимаю, это до сих пор является то, что у меня есть только 2 варианта относительно позиции/размера моего содержания (бар действия в комплекте):
верхней части экрана, которая будет показывать ActionBar частично скрыт statusbar,
или ниже нижнего уровня statusBar, который оставит меня с «отверстием», когда statusBar будет скрыт. -_-
Теперь я ищу решение для анимирования ActionBar вне экрана/на экране внутри мой метод onSystemUiVisibilityChangeListener, но не могу найти способ захватить его вид, чтобы сделать это, решения размещены там https://stackoverflow.com/a/21125631/6463888 выглядят устаревшими ...

ответ

0

Привет, ваш проблема вызвана природой StatusBar, она имеет отдельный макет из вашего основного контента, и вам нужно установить его цвет вручную. Например, когда вы вызываете onSystemUiVisibilityChange(), вы можете взять цвет своего фона и после того, как цвет ColorBar будет установлен с этим цветом. Это обходное решение, чтобы избежать двух разных цветов фона.

+0

Ну, на самом деле, моя цель - полностью скрыть это, я думал, что цель этого погружного режима состояла в том, чтобы заполнить экран моим содержимым, скрывая статус и панель навигации ... Я не хочу изменить его цвет фона, я просто хочу, чтобы он исчез, как на панели навигации ... – Shiva

+0

Mmmmmmmm да, я понимаю, вы пытались использовать toolbar.hide(), а вместо getSupportActionBar(). hide()? – rik194

+0

afaik, не существует метода hide() для объекта панели инструментов ... Я только что редактировал свой вопрос, чтобы отразить мое текущее положение ... – Shiva

0

Итак, так, как я решил, это может показаться немного растянутым, но я всего лишь новичок, поэтому не стесняйтесь комментировать! Я больше не использую getSupportActionBar().show(); или getSupportActionBar().hide();, но мне удалось захватить представление, содержащее ActionBar, которое является AppBarLayout, и вместо этого я анимировал этот вид. Поэтому я называю небольшую функцию, чтобы анимировать ее на экране или вне его внутри. onSystemUiVisibilityChange:
private void animateActionBarInOrOut (boolean появляется) { Log.i (TAG, "animateActionBarInOrOut :: actual position =" + toolbar.getY()); если (появляется) { панель инструментов.анимация(). ПереводY (48) .alpha (1); // перемещаем его из экрана } else { toolbar.animate(). translationY (-48) .alpha (0); // переместить его из экрана }}

Хотя это не совсем ответ на первоначальный вопрос, он работает в качестве решения проблемы, просто нужно переместить содержимое соответственно ...

0

Сегодня я столкнулся с такой же проблемой. Но я не решил эту проблему setSystemUiVisibility.Я решить ее, используя следующий метод:

  1. шкура:. Введите полный экран

    mActivity.getWindow() setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

  2. шоу: обычный дисплей

    mActivity.getWindow() clearFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN);.