2011-09-30 76 views
15

我正在开发一个简单的演示。在这个演示中,我只是创建一个简单的自定义警报对话框。它工作正常。更改构建版本后,Android自定义警报对话框显示错误

它显示了当我在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(); 

enter image description here enter image description here

在这里,你可以清楚地发现,1st image节目的背景。它在android 1.6版本中构建,而2nd image不显示背景。它显示整个黑屏。它的内置版本为android 2.2。如果有人能解决这个问题,我非常感谢。

任何人都可以帮助我解决这个简单而愚蠢的问题吗?

在此先感谢。

+1

当你说改变版本,你的意思是目标版本,最低版本还是最高版本?或者你是否只是指具有更高版本的不同设备? – Gallal

+0

我正在谈论项目构建目标版本。 –

+0

愚蠢的评论,但我已经面临同样的问题,所以......你是否在使用sdk 2.2模拟器测试演示导致设备或模拟器导致有时视图不能完美显示时运行较高版本的应用程序来降低版本模拟器或设备。 – MKJParekh

回答

2

它通过更改Custom Dialog Theme 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> 
0

显然,这是一个known issue

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

一种解决方法是以接近空白的主题(如Panel或 半透明)开始,然后在自己的布局中呈现所需内容(例如 对话边等)。

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

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

1

我也遇到了同样的问题。问题是,当我叫对话框类

对话框(上下文的背景下,INT的ThemeID)

它会隐藏背景动作的构造。我发现的唯一的解决方案是不调用此构造函数,而不是只调用

对话框(上下文的背景下)

,并设置你的风格布局文件。

因此,在你的代码,只写

超(上下文)

,而不是

超(上下文的ThemeID);

+1

它没有给出我想要的正确结果。 –