2010-12-01 2 views
8

Edited добавить более подробную информацию: (первоначально просили почти два месяца назад ... до сих пор не нашли решение)Включение полноэкранного режима Активность для восстановления/повторного просмотра резюме?

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

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

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

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

ответ

9

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

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

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

0

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

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

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

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

0

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

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

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

+0

Я считаю, что я пробовал практически любую комбинацию этого. Я могу, возможно, сделать это еще раз более тщательно, чтобы дважды проверить, но я попытался в коде, в манифесте, как на уровне приложения, только на уровне активности, так и на обоих. Думаю, я напишу матрицу всех возможных комбинаций и протестирую один за другим, но мое нынешнее мышление состоит в том, что это условие гонки, которое требует более хакерского решения (отсюда 250 pt bounty). – Rich 2011-02-01 13:53:47

1

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

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
           WindowManager.LayoutParams.FLAG_FULLSCREEN); 
+0

Я положил это в onResume, onPostResume, onWindowConfigurationChanged и т. Д. ... вы его назовете. Отличное предложение, но это нечто более странное. Это происходит в странные времена, и он исправляет себя, когда я показываю/скрываю определенные виды или когда появляется диалоговое окно. Мне жаль, что не было обратного вызова, которое происходит после завершения всего рисования. Я думаю, что это то, что я ищу, но не уверен, что класс Activity предоставляет его. – Rich 2011-02-01 15:00:29

+0

Это действительно странно ... Если вы найдете ответ, отправьте его здесь, я буду рад прочитать его. – gnclmorais 2011-02-01 15:20:18

+0

После завершения рисования нет обратного вызова, но я чувствую, что вы предпочтете обратный вызов после завершения компоновки; это фаза макета, которая решает позиции вещей, а не этап рисования. Используйте [`View.getViewTreeObserver()`] (http://developer.android.com/reference/android/view/View.html#getViewTreeObserver%28%29) и [`OnPreDrawListener`] (http: // разработчик. android.com/reference/android/view/ViewTreeObserver.OnPreDrawListener.html). Не знаю, насколько это действительно поможет вам, так как форсирование макета, похоже, не работает для вас. – 2011-02-02 19:16:45

1

В моем случае это поведение было вызвано возобновлением с экрана блокировки. Не знаю, почему, но после добавления пустой перегруженной функции она была исправлена ​​(но я тестировал ее только на моем 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

Я нашел решение этой проблемы:

@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

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

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

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

Смежные вопросы