已编辑以添加更多详细信息: (最近两个月前问过......还没有找到解决方案)
我的活动有点复杂的观点。在技术意义上并不复杂......只有很多事情要发生。此特定应用程序中的所有活动都设置为FullScreen NoTitleBar,并且它们都设置为横向方向。在应用程序被隐藏然后恢复的过程中,我注意到在开发的早期阶段,布局不经常垂直向下滑动,就好像为标题栏和状态栏腾出空间一样。
稍后在开发中,该应用程序现在调用各种外部意图。我现在注意到,当从外部处理的触发意图(例如创建“选择器”意图或选择图像)恢复时,更倾向于进行相同的转换。我能够使用完全相同的步骤不一致地重现它...有时它有时会发生。似乎在测量和布局的各个阶段之间存在竞争条件。我假设系统正在为我做的其中一个步骤是检查全屏和notitlebar,并进行必要的转换。在某些情况下可能会发生这种情况。
我放了一堆日志记录,并调用了invalidate(),requestLayout()等尝试捕获竞争条件,但问题似乎在我的布局之外。我的根布局的top()和bottom()值分别始终为0和屏幕的高度,即使我在问题发生时记录这个值。
是否有其他方法的Window,WindowManager或任何其他系统视图相关的对象,我可以强制完全重新测量,重绘,重新检查当前的主题/样式标志?
答案 0 :(得分:9)
我有完全相同的问题,并尝试了几个aproches(如上所述)。 他们都没有工作。但是我找到了以下解决方法:
protected void onResume() {
super.onResume();
handler.postDelayed(new Runnable() {
public void run() {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}, 1000);
}
视图会在此过程中做一个短暂的闪烁,但至少它不会保持歪曲。 仍然需要找到一个干净的解决方案。然而,这支持了你的论点,即存在某种时间或种族问题。
答案 1 :(得分: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.
*/
}
答案 2 :(得分:0)
我不确定它是否有效,但您可能想尝试使用该方法:
this.getWindow().getDecorView().invalidate();
如果它本身不起作用,请尝试在onDraw(Canvas)方法中添加删除标题栏所需的说明,并在启动时执行类似的调整。
希望有所帮助。
答案 3 :(得分:0)
嘿嘿, 我有同样的问题。我通过在清单XML中设置这些选项来修复它(似乎API接口有点儿错误)。详情请见http://thedevelopersinfo.wordpress.com/2009/10/21/making-an-fullscreen-activity/
opticron
答案 4 :(得分:0)
您是否在清单或代码中设置了FullScreen NoTitleBar? 如果你使用代码,它可能会在你的代码启动之前被渲染?
<application android:label="@string/app_name" android:icon="@drawable/icon" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
我了解您可以在应用程序中为各个活动设置主题。你呢?它们是否与您的应用程序设置冲突?
答案 5 :(得分:0)
您是否在onResume()中尝试了这个?
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN );
答案 6 :(得分: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);
}
答案 7 :(得分:0)
我通过设置应用程序的主题而不是单个活动来修复它。
<application
android:icon="@drawable/icon"
android:installLocation="auto"
android:label="@string/app_name"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >
这对我有用。如果我们启动的下一个活动不是全屏活动而当前活动是全屏活动,则会出现此问题。