Поддержание режима "выключен" (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);
}
}
});
Спасибо П.Т.!