Android自定义警告对话框在更改构建版本后显示错误

15

我正在开发一个简单的演示。在这个演示中,我只是创建了一个简单的自定义警报对话框。它在1.6版本中构建应用程序时表现良好。

但是当我将Android版本从1.6更改为2.2时,它显示出意外的结果。它不会显示我展示自定义警报对话框的背景屏幕。

这是我的XML文件。 自定义对话框主题文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CustomDialogTheme" parent="@android:style/AlertDialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowAnimationStyle">@android:style/Theme.Dialog</item>
    </style>
</resources>

这是我的自定义确认对话框类 - My CustomConfirmOkDialog Class

package com.utility.org;

import android.app.Activity;
import android.app.Dialog;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

    public class CustomConfirmOkDialog extends Dialog implements OnClickListener
    {
        private Button okButton = null;
        private TextView infoText=null,confirmBody=null;
        private int errorMessage=0;
        @SuppressWarnings("unused")
        private Activity activity;

        public CustomConfirmOkDialog(Activity context,int customdialogtheme,int errorMessage) 
        {
            super(context,customdialogtheme);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.confirm_ok);
            this.errorMessage = errorMessage;
            this.activity = context;
            initControls();
        }

        private void initControls()
        {
            okButton = (Button) findViewById(R.id.ok_button);
            okButton.setOnClickListener(this);

            infoText = (TextView)findViewById(R.id.infoText);
            confirmBody = (TextView)findViewById(R.id.confirmBody);

            switch (this.errorMessage) 
            {

                case Utility.INVALID_USERNAME_PASSWORD:
                    try
                    {
                        infoText.setText(R.string.signIn);
                        confirmBody.setText(R.string.invalidUsernameAndPassword);
                    }
                    catch (Exception e) 
                    {
                        e.printStackTrace();
                    }
                    break;


                default:
                    break;
            }
        }
        public void onClick(View v) 
        {
            dismiss();
        }
    }

使用以下代码从我的主活动调用此类。

CustomConfirmOkDialog dialog = new CustomConfirmOkDialog(MainActivity.this, R.style.CustomDialogTheme, Utility.INVALID_USERNAME_PASSWORD);
dialog.show();

enter image description here enter image description here

你可以清楚地看到,第一张图片显示了背景。它是在Android 1.6版本中构建的,而第二张图片则没有显示背景。它显示了整个黑屏。它是在Android 2.2版本中构建的。如果有人能解决这个问题,我将不胜感激。

有人能帮我解决这个简单而愚蠢的问题吗?

提前感谢。


1
当你说改变版本时,你是指目标版本、最小版本还是最大版本?或者你只是指在另一个具有更高版本的设备上? - Gallal
我在谈论项目构建目标版本。 - Chirag
有点儿愚蠢的评论,但我曾经遇到过相同的问题。你是在使用SDK 2.2的模拟器进行演示测试吗?因为有时候当运行高版本应用于低版本模拟器或设备时,视图显示不完美。 - MKJParekh
3个回答

2

通过更改自定义对话框主题xml文件中的以下代码,解决了我的问题。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CustomDialogTheme" parent="@android:style/Theme.Translucent.NoTitleBar">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
    </style>
</resources>

1

我也遇到了同样的问题。问题出在我调用Dialog类的构造函数时

Dialog(Context context, int themeId)

它会隐藏背景活动。我找到的唯一解决方案是不要调用这个构造函数,而是只调用

Dialog(Context context)

并在布局文件中设置您的样式。

因此,在您的代码中,只需编写

super(context)

而不是

super(context, themeid);


1
它没有给出我想要的正确结果。 - Chirag

0

显然,这是一个已知问题

只有在尝试从框架主题中继承时才会出现此问题。直接使用@android:style仍将其视为非全屏幕,可以按预期穿透黑色背景。

一种解决方法是从几乎空白的主题(如面板或半透明)开始,然后在自己的布局中呈现所需内容(例如对话框边缘等)。

虽然我自己还没有完全理解这个解决方案。

实际上,我不再确定他们是否在谈论您看到的确切相同的错误,因为他们正在讨论它无法在旧版本的SDK上工作(而不是像您的新版本)。请参见错误报告


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接