我为 Activity 使用了对话框主题,它在 Android <= 4.3 上运行良好,但在最新的 KitKat 4.4 上运行良好。这是问题的屏幕截图:
缺少顶部布局。你可以看到边界似乎被切断了。
我正在使用Android模拟器来测试应用程序,所以我不知道问题是由于虚拟机还是由于其他原因。
我为 Activity 使用了对话框主题,它在 Android <= 4.3 上运行良好,但在最新的 KitKat 4.4 上运行良好。这是问题的屏幕截图:
缺少顶部布局。你可以看到边界似乎被切断了。
我正在使用Android模拟器来测试应用程序,所以我不知道问题是由于虚拟机还是由于其他原因。
您可以解决从下面的代码中删除的问题。
dialog.getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
您应该扩展 Dialog 并在 onCreate 中调用以下方法:
@TargetApi(14)
public void toggleHideBar() {
if (Build.VERSION.SDK_INT < 18) {
return;
}
// The UI options currently enabled are represented by a bitfield.
// getSystemUiVisibility() gives us that bitfield.
int uiOptions = getWindow().getDecorView().getSystemUiVisibility();
int newUiOptions = uiOptions;
boolean isImmersiveModeEnabled =
((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
if (isImmersiveModeEnabled) {
Log.d("dialog", "Turning immersive mode mode off.");
} else {
Log.d("dialog", "Turning immersive mode mode on.");
}
// Status bar hiding: Backwards compatible to Jellybean
if (Build.VERSION.SDK_INT >= 16 && (newUiOptions & View.SYSTEM_UI_FLAG_FULLSCREEN) <= 0) {
newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
}
// Immersive mode: Backward compatible to KitKat.
// Note that this flag doesn't do anything by itself, it only augments the behavior
// of HIDE_NAVIGATION and FLAG_FULLSCREEN. For the purposes of this sample
// all three flags are being toggled together.
// Note that there are two immersive mode UI flags, one of which is referred to as "sticky".
// Sticky immersive mode differs in that it makes the navigation and status bars
// semi-transparent, and the UI flag does not get cleared when the user interacts with
// the screen.
if (Build.VERSION.SDK_INT >= 18 && (newUiOptions & View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) <= 0) {
newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
}
getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
}
最后,我尝试使用 Android 4.4 中提供的新全屏沉浸式模式来做一些事情。安卓全屏
只需将其放在“对话框”活动的onResume中,就可以在全屏活动中使用对话框,而无需顶部切割:)
编辑:为目标版本添加了兼容性检查,setSystemUiVisibility 在 Api 11 中实现,但似乎只需要 android 4.4 的“补丁”)
// Only for Api >=4.0
if (android.os.Build.VERSION.SDK_INT >= 16) {
int mUIFlag = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION // I removed this
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; // and this to keep the navigation bar
getWindow().getDecorView().setSystemUiVisibility(mUIFlag);
}
我有类似的问题,但使用自定义对话框。不幸的是,我无法在此处发布我的屏幕截图。
我用几个不同的选项进行了测试,看起来在全屏模式下运行父活动会影响这一点。如果我删除以下代码,对话框似乎工作正常。
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
在 Google Nexus 7(第一版)上获得 4.4 KitKat 更新后,我注意到了这一点。此外,是否存在对话框的标题似乎没有什么区别。
只需在活动的onCreate方法中添加这行代码即可。
getWindow().setFlags(0x04000000, 0x04000000); // FLAG_TRANSLUCENT_STATUS
我遇到了与您在屏幕截图中描述和显示的完全相同的问题。问题仅发生在 KitKat 上。
就我而言,它发生在一些使用自定义样式的弹出对话框上。接下来是一种在应用于对话框时重现问题的样式。注意第一行,它具有属性parent="android.Theme",通过删除该属性问题得到解决。
<style name="transparent_low_dim" parent="android:Theme">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.3</item>
<item name="android:windowAnimationStyle">@null</item>
</style>
为了解决这个问题,我删除了 parent 属性,所以第一行现在看起来像下一个:
<style name="transparent_low_dim">