ОБНОВЛЕНО ОТВЕТ:
установить OnSystemUiVisibilityChangeListener, заставить захватывающий режим, когда видимость 0 (а не 6).
if(android.os.Build.VERSION.SDK_INT >= 19) {
getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if(visibility == 0) {
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);
}
}
});
}
OLD, NASTY ОТВЕТ:
это противно, но это решение IFF вы показывающей ActionBar:
- добавить OnGlobalLayoutListener к ViewTreeObserver из 'action_bar_container'.
- в реализации OnGlobalLayoutListener, проверьте, отображается ли видимость «action_bar_container», если GONE или нет.
- , когда он переместился с GONE на GONE (и предположил, что вы находитесь в режиме погружения), затем снова принудительно активируйте режим с помощью метода setSystemUiVisibility.
if(android.os.Build.VERSION.SDK_INT >= 19) {
int actionBarContainerId = Resources.getSystem().getIdentifier("action_bar_container", "id", "android");
((ViewGroup)findViewById(actionBarContainerId)).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int actionBarContainerId = Resources.getSystem().getIdentifier("action_bar_container", "id", "android");
ViewGroup actionBarContainer = (ViewGroup) findViewById(actionBarContainerId);
if(actionBarContainer.getVisibility() == View.GONE) {
if(DEBUG) Log.d(TAG, "...PROBABLY IN IMMERSIVE MODE AND ALL IS GOOD!..");
} else {
if(DEBUG) Log.d(TAG, "...PROBABLY NO LONGER IN IMMERSIVE MODE, HEY..");
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);
}
}
});
}
Хм, это раздражает. Интересно, есть ли неофициальный способ его обнаружить. – Glitch
Я думаю, что это ошибка дизайна, когда SYSTEM_UI_FLAG_HIDE_NAVIGATION не очищается в липком режиме, когда система ui становится видимой.Если у вас есть ui с сложным обнаружением жестов, на самом деле нет способа отличить салфетки вниз (которые следует игнорировать) от других жестов (которые должны быть обработаны). –
Я полностью согласен с этим, потому что это имеет значение, если ваш контент наложен на полупрозрачный вид. Я понимаю, почему они не хотели, чтобы существующие триггеры срабатывали, но они могли по крайней мере добавить новое событие или новый флаг. –