Поддержание режима "выключен" (View.setSystemUiVisibility) через перезагрузки

Я настраиваю режим "выключен" для моего приложения Android, когда он работает на последних телефонах и планшетах. В моем методе onCreate() я добавил:

View rootView = getWindow().getDecorView();
rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); // aka View.SYSTEM_UI_FLAG_LOW_PROFILE

это работает лучше, чем я думал. На моем планшете Android 3.2 панель состояния запускается в режиме низкого профиля (все кнопки на панели заменены точками). Если я взаимодействую с кнопками на панели, он станет нормальным, а затем вернется в низкопрофильный режим (например, если я проверю окно конфигурации/уведомлений в строке состояния). Таким образом, похоже, что это больше свойство моего приложения, чем "команда", чтобы напрямую скрыть интерфейс.

Есть два угловых случая, которые не обрабатываются. Во-первых, если пользователь удаляет строку состояния, не нажимая ни на одну из точек, панель становится активной. Он никогда не возвращается в режим низкого профиля, пока пользователь фактически не взаимодействует с чем-либо на панели (например, смотрит на уведомления или снимает снимок экрана). Итак, если они вернутся к взаимодействию с моим приложением, строка состояния больше не находится в режиме низкого профиля. (У приложения Gallery также есть эта проблема, поэтому, возможно, это не только я.) Второй краевой случай - это возобновление с экрана блокировки. Если я нажму кнопку питания, чтобы заблокировать планшет, затем откройте его и возобновите приложение, строка состояния будет полностью видимой (и взаимодействие с ней ничего не изменит). (Приложение Gallery не имеет этой проблемы.)

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

rootView.setOnSystemUiVisibilityChangeListener(
  new View.OnSystemUiVisibilityChangeListener() {
    @Override
    public void onSystemUiVisibilityChange(int visibility) {
      if (visibility == View.STATUS_BAR_VISIBLE) {
        game.flagUIIsVisible();
      }
    }
  });

В моем случае метод объекта game просто устанавливает флаг, указывающий, что пользовательский интерфейс стал невидимым. Позже, если в моем приложении есть какие-либо сенсорные события (они обрабатываются одним и тем же объектом game), и этот флаг установлен, я снова вызываю вызов STATUS_BAR_HIDDEN.

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

Я также попытался вызвать вызов STATUS_BAR_HIDDEN в моем пути onResume, но это тоже не помогло.

Я ищу информацию о том, что это какая-то известная ошибка или подсказки для того, что может делать приложение Gallery (предполагая, что оно делает что-то по-другому). Или предложения для других API-интерфейсов, чтобы попробовать (или другие детали, которые могут быть релевантными).

Я использую libGDX, и мое приложение имеет только один вид, поэтому его довольно просто. Представление также настроено на полноэкранный режим без заголовка libGDX. В моем манифесте установлено, что у моего целевого объектаSdkVersion установлено значение 15.

Ответ 1

Я подозреваю, что в Android 3.2 есть ошибка, так как я могу обойти проблему возобновления блокировки, повторно включив строку состояния, прежде чем отключать ее в onResume. Нет OnSystemUiVisibilityChangeListener.

В частности, в моем пути onResume у меня есть такой код:

View rootView = getWindow().getDecorView();
rootView.setSystemUiVisibility(View.STATUS_BAR_VISIBLE);
rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN);

По-видимому, ненужный вызов, чтобы сделать панель состояния видимой, кажется, делает последующий вызов, чтобы заставить скрытую панель состояния работать на самом деле после разблокировки устройства.

Ответ 2

Android 4.2 здесь, на планшете Samsung - ваши решения не сработали для меня, я действительно смог это сделать с ValuAnimator, выпущенным сразу после onSystemUiVisibilityChange, с onAnimationEnd прослушивателем

        topView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
          @Override
          public void onSystemUiVisibilityChange(int visibility) {
             hideMenu();
          }
        });

    private void hideMenu(){

    ValueAnimator hideAnim = ValueAnimator.ofInt(1,2);
    hideAnim.setDuration(1);
    hideAnim.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            topView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
        }
    });
    hideAnim.start();

}

Ответ 3

Это устранило мою проблему:

rootView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
    @Override
    public void onSystemUiVisibilityChange(int visibility) {
        if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) {
            rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
            rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
        }
    }
});

Спасибо П.Т.!