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

Posted

技术标签:

【中文标题】更改构建版本后 Android 自定义警报对话框显示错误【英文标题】:Android Custom Alert Dialog Display Error after changing the Build Version 【发布时间】:2011-11-28 08:23:35 【问题描述】:

我正在开发一个简单的演示。在这个演示中,我只是创建了一个简单的自定义警报对话框。它工作正常。

当我在 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>

这是我的 CustomConfirmOkDialog 类

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();

在这里您可以清楚地注意到1st image 显示背景。它在 android 1.6 版本中构建,而 2nd image 不显示背景。它显示整个黑屏。它在 android 版本 2.2 中构建。如果有人能解决这个问题,我非常感谢。

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

提前致谢。

【问题讨论】:

你说的更改版本是指目标版本、最小版本还是最大版本?还是您只是指在具有更高版本的不同设备上? 我说的是项目构建目标版本。 愚蠢的评论,但我也遇到了同样的问题,所以...您是否使用 sdk 2.2 在模拟器中测试演示导致设备或模拟器导致有时在运行更高版本的应用程序时视图无法完美显示到较低版本的模拟器或设备。 【参考方案1】:

它通过更改自定义对话框主题 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>

【讨论】:

【参考方案2】:

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

对话框(上下文上下文,int themeId)

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

对话框(上下文上下文)

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

所以在你的代码中,只写

超级(上下文)

而不是

超级(上下文,主题ID);

【讨论】:

它没有给出我想要的正确结果。【参考方案3】:

显然,这是known issue。

只有在您尝试继承框架主题时才会发生这种情况。 直接使用@android:style 仍会将它们视为非 全屏,按预期穿透黑色背景。

一种解决方法是从几乎空白的主题开始(例如 Panel 或 半透明)然后在自己的布局中渲染你需要的东西(比如 对话框边缘等)。

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

实际上,我不再确定他们在谈论您所看到的完全相同的错误,因为他们在谈论它不适用于旧版本的 sdk(不是像您这样的新版本) .请参阅bug report。

【讨论】:

以上是关于更改构建版本后 Android 自定义警报对话框显示错误的主要内容,如果未能解决你的问题,请参考以下文章

不是我创建的 Android 默认 alertdialog 背景颜色

自定义警报对话框android

带有圆角和透明背景的 Android 自定义警报对话框

如何更改警报对话框标题分隔线颜色android

我们如何使用样式自定义警报对话框的字体?

Android- 使用 EditText 帮助修复自定义警报对话框