【问题标题】:Custom dialog on android Kitkat 4.4 cuts top areaandroid Kitkat 4.4 上的自定义对话框切割顶部区域
【发布时间】:2014-01-09 05:49:01
【问题描述】:

在我的 android 应用程序中,我在我的 activity 中使用 custom dialog。我为这个自定义对话框赋予了透明背景的样式。我在 Kitkat 4.4 上遇到了奇怪的问题。该对话框仅在 Kitkat 4.4 上从顶部切开。SDK 级别 this 链接,但没有得到如何按照我的要求实现它。 谢谢。

代码:

 public void showGameOverDialog(int score) {

        final Dialog dialog = new Dialog(Level1Activity_Room.this,
                R.style.DialogBackground);
        dialog.setContentView(R.layout.gameover_dialog_layout);         
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);
        dialog.show();
}

R.style.DialogBackground :

 <style name="DialogBackground" parent="@android:style/Theme.Dialog">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

【问题讨论】:

    标签: android dialog android-dialog android-4.4-kitkat customdialog


    【解决方案1】:

    最后我通过对现有代码的一些修改解决了这个问题。还将目标级别从 Project-&gt;Right Click-&gt;Android 更改为 Android 4.4

        public void showGameOverDialog(int score) {
            final Dialog dialog = new customeDialogClass(Level1Activity_Room.this,
                    R.style.DialogBackground);
            dialog.setContentView(R.layout.gameover_dialog_layout);
            dialog.setCanceledOnTouchOutside(false);
            dialog.setCancelable(false);
    dialog.show();
    }
    

    customeDialogClass.java

     @TargetApi(14)
    public class customeDialogClass extends Dialog {
    
        public customeDialogClass(Context context) {
            super(context);
            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.e("log1---", "Turning immersive mode mode off.");
            } else {
                Log.e("log2-----", "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;
            }
    
            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);
        }
    
        public customeDialogClass(Context context, boolean cancelable,
                OnCancelListener cancelListener) {
            super(context, cancelable, cancelListener);
        }
    
        public customeDialogClass(Context context, int theme) {
            super(context, theme);
            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.e("log1---", "Turning immersive mode mode off.");
            } else {
                Log.e("log2-----", "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;
            }
    
            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);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      kitkat 4.4 中没有问题,我认为问题出在 R.layout.gameover_dialog_layout 中以获得屏幕支持

      【讨论】:

      • 但在其他 sdk
      【解决方案3】:

      它通常通过在 Android 4.4 或更低版本中添加的标题栏。 通过在自定义对话框中添加以下行来解决此问题。

      dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多