我有一个布局,其中包含一个占据整个屏幕的 GLSurfaceView。在屏幕底部,我有一个覆盖 GLSurfaceView 的半透明工具栏 (LinearLayout)。另外,我的应用程序是全屏的 ( android:theme="@android:style/Theme.NoTitleBar.Fullscreen
)。
通常,一切都很好,但从 ICS 开始,每当用户返回应用程序(从 返回onPause
)时,操作系统都会播放一个快速动画,其中应用程序开始时 Android 状态栏显示在顶部,应用程序屏幕被按下。然后状态栏消失,应用程序的屏幕向上移动到正常的全屏位置。
当这个动画完成时,GLSurfaceView 最终覆盖了工具栏的上半部分,工具栏覆盖了 GLSurfaceView 的下半部分。看起来底部显示的工具栏部分正是 Android 状态栏的大小。
当然,我希望工具栏完全显示和覆盖 GLSurfaceView,这就是当应用程序从onCreate
.
任何人都知道是什么导致了这个问题以及如何解决它?
我找到了一种解决方法,但远非最佳。我可以通过在调用invalidate()
后的某个时间发布到工具栏来正确显示工具栏。onResume()
但是如果invalidate()
调用太快,问题就不会得到解决。这是解决方法的代码invalidate()
5 seconds after 调用onResume()
,导致工具栏在应用程序重新启动后 5 秒正确显示。
@Override
protected void onResume() {
super.onResume();
mGLSurfaceView.onResume();
// Test to try to fix half hidden toolbar problem
View toolBar = findViewById(R.id.menu_bar);
toolBar.postDelayed(new Runnable() {
@Override
public void run() {
View toolBar = findViewById(R.id.menu_bar);
toolBar.invalidate();
}
}, 5000);
}
编辑:
上面的代码不会导致工具栏正确显示。我在上面的代码中的调试中取出了一行设置文本,TextView
事实证明,如果我不更新完全不相关的,工具栏就不会出现TextView
!
我找到了另一种方法来使上述糟糕的解决方法起作用,方法onResume
是在调用时首先删除工具栏,然后稍后再将其恢复。请看下面的代码: 请注意,使用View.INVISIBLE
代替View.GONE
不会使工具栏在延迟后出现。
@Override
protected void onResume() {
super.onResume();
mGLSurfaceView.onResume();
// Test to try to fix half hidden toolbar problem
View toolBar = findViewById(R.id.menu_bar);
toolBar.setVisibility(View.GONE);
toolBar.postDelayed(new Runnable() {
@Override
public void run() {
View toolBar = findViewById(R.id.menu_bar);
toolBar.setVisibility(View.VISIBLE);
//mDebugText.setText("Menu bar to front.\n" + mDebugText.getText());
}
}, 5000);
}