Заставить полноэкранную активность переиздать / перерисовать резюме? - PullRequest
8 голосов
/ 01 декабря 2010

Отредактировано, чтобы добавить больше деталей: (первоначально задавался почти два месяца назад ... до сих пор не нашел решения)

У меня есть деятельность с несколько сложным видом. Не сложно в техническом смысле ... просто много чего происходит. Все действия в этом конкретном приложении установлены на FullScreen NoTitleBar, и все они настроены на альбомную ориентацию. В начале разработки я заметил, что когда приложение скрыто, а затем возобновляет работу, нередко наблюдается тенденция к вертикальному смещению макета, как будто для освобождения места для заголовка и строки состояния.

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

Я поставил кучу журналирования и звонков на invalidate (), requestLayout () и т. Д., Пытаясь, возможно, поймать состояние гонки, но проблема кажется внешней для моих макетов. Значения top () и bottom () моего корневого макета всегда равны 0 и высоте моего экрана, соответственно, даже когда я регистрирую это во время возникновения проблемы.

Есть ли какой-либо другой метод Window, WindowManager или любого другого объекта, относящегося к системному представлению, который я могу принудительно переизмерить, перерисовать, повторно проверить флаги текущей темы / стиля?

Ответы [ 8 ]

9 голосов
/ 21 марта 2011

У меня была точно такая же проблема, а также я попробовал несколько апрошей (как указано выше).Никто из них не работал.Тем не менее, я нашел следующий обходной путь:

 protected void onResume() {
   super.onResume();
   handler.postDelayed(new Runnable() {
      public void run() {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                             WindowManager.LayoutParams.FLAG_FULLSCREEN);
      }
   }, 1000);    
 }

представление будет кратковременно мерцать в этой процедуре, но по крайней мере оно не останется обрезанным.Чистое решение еще нужно найти.Однако это подтверждает ваш тезис о том, что существует какая-то проблема времени или гонки.

1 голос
/ 21 декабря 2011

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

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    /* Workaround a probable Android bug with fullscreen activities:
     * on resume status bar hides and black margin stays, 
     * reproducible half of the time when coming back from lock screen 
     * (tested on HTC Wildfire)
     * No idea why but this empty overload method fixed it.
     */
}
0 голосов
/ 01 ноября 2012

Я исправил это, установив тему для приложения, а не для отдельных действий.

<application
        android:icon="@drawable/icon"
        android:installLocation="auto"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >

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

0 голосов
/ 19 июня 2012

Я нашел решение для этого:

    @Override
    protected void onResume() {
        Log.e("", "onResume");
        super.onResume();

        //this is a simple Splash with "Game paused" Text inside! in my main.xml
        final LinearLayout gamePause_text = (LinearLayout) findViewById(R.id.gamePause_text);
        OnGlobalLayoutListener asdf = new OnGlobalLayoutListener(){
            public void onGlobalLayout() {
                Log.e("", "onGlobalLayout");
                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                                     WindowManager.LayoutParams.FLAG_FULLSCREEN);
                gameSurface.onResume(); //OpenGL Surface onResume();
                gamePause_text.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        };
        gamePause_text.getViewTreeObserver().addOnGlobalLayoutListener(asdf);
    }
0 голосов
/ 01 февраля 2011

Вы пробовали это в onResume ()?

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                                WindowManager.LayoutParams.FLAG_FULLSCREEN );
0 голосов
/ 31 января 2011

Вы установили FullScreen NoTitleBar в своем манифесте или в коде? Если вы используете код, возможно, он рендерится до того, как ваш код заработает?

<application android:label="@string/app_name" android:icon="@drawable/icon" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">

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

0 голосов
/ 04 января 2011

Эй, Рич, У меня была точно такая же проблема. Я исправил это, установив эти параметры в манифесте XML (кажется, интерфейс API немного глючит) Подробности здесь: http://thedevelopersinfo.wordpress.com/2009/10/21/making-an-fullscreen-activity/

opticron

0 голосов
/ 12 декабря 2010

Я не уверен, что это сработает, но вы можете попробовать это следующим способом:

this.getWindow().getDecorView().invalidate();

Если это не сработает само по себе, попробуйте добавить в метод onDraw (Canvas) инструкции, необходимые для удаления строки заголовка и выполнения аналогичных настроек, которые ваша деятельность может выполнять при запуске.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...