Android 在安卓4.X上无法读取膨胀的AlertDialogs,而在安卓2.X上则看起来非常完美

Android 在安卓4.X上无法读取膨胀的AlertDialogs,而在安卓2.X上则看起来非常完美,android,android-layout,android-theme,android-inflate,android-version,Android,Android Layout,Android Theme,Android Inflate,Android Version,为了显示包含丰富内容和输入元素的对话框,我使用Android的AlertDialog.Builder创建一个AlertDialog对象,然后使用系统的LayoutInflater将内容(setView(…))设置为某个XML布局文件 这在Android 2.X上看起来非常完美(黑色背景,白色文本): 但在Android 4.X上,它根本不可读: 注意:这些对话框当然不相同,但两个对话框都出现问题 那么我做错了什么?我在API级别=11上使用Theme.Holo.Light 编辑1:这是我用于

为了显示包含丰富内容和输入元素的对话框,我使用Android的
AlertDialog.Builder
创建一个
AlertDialog
对象,然后使用系统的
LayoutInflater
将内容(
setView(…)
)设置为某个XML布局文件

这在Android 2.X上看起来非常完美(黑色背景,白色文本):

但在Android 4.X上,它根本不可读:

注意:这些对话框当然不相同,但两个对话框都出现问题

那么我做错了什么?我在API级别<11上使用
Theme.Light
,在>=11上使用
Theme.Holo.Light

编辑1:这是我用于充气的代码:

private LayoutInflater mGlobalInflater; // in Activity class
mGlobalInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); // in Activity's onCreate()
mGlobalInflater.inflate(R.layout.input_dialog, null); // when needed
编辑2:以下是“选择日期”视图的膨胀XML:


这是正确的吗?或者我必须将
main活动替换为
mContext
(例如,
Activity
的上下文在
onCreate()

中分配给它的变量
mContext
而不是像上面的代码那样使用
getApplicationContext(),使用活动中的一个,如下所示:

    mGlobalInflater = LayoutInflater.from(this); // in Activity's onCreate()

这应该希望为对话框使用匹配的主题。

不要像上面的代码那样使用
getApplicationContext()
获取布局展开器,而是像下面这样使用活动中的主题:

    mGlobalInflater = LayoutInflater.from(this); // in Activity's onCreate()

这应该很有希望为对话框使用匹配的主题。

当你说你正在使用
主题.Light
主题.Holo.Light
时,你在什么上应用这个主题很重要

如果它是您的
应用程序
或您的
活动
,则会有所不同。如果您在
应用程序
级别上应用它,那么如果您从应用程序中获得
上下文
,您将使用该主题(类似于
活动
)。如果应用程序和活动的两个主题不同,您会注意到它们的区别

当你阅读上面@Joe的答案时,请记住这一点。您提到@Joe的答案解决了api11+的问题,但之前的问题就解决了

所以只要看看你的AndroidManifest,看看你对
的主题有什么看法,以及你正在膨胀对话框的


希望这有助于当你说你正在使用
Theme.Light
Theme.Holo.Light
时,你将这个主题应用在什么上很重要

如果它是您的
应用程序
或您的
活动
,则会有所不同。如果您在
应用程序
级别上应用它,那么如果您从应用程序中获得
上下文
,您将使用该主题(类似于
活动
)。如果应用程序和活动的两个主题不同,您会注意到它们的区别

当你阅读上面@Joe的答案时,请记住这一点。您提到@Joe的答案解决了api11+的问题,但之前的问题就解决了

所以只要看看你的AndroidManifest,看看你对
的主题有什么看法,以及你正在膨胀对话框的


希望这有帮助我找到的唯一可行的解决方案是:

    LayoutInflater mInflater, mGlobalInflater;
    mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= 11) {
        mGlobalInflater = mInflater;
    }
    else {
        mGlobalInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    }

现在,您可以使用
mInflater
进行正常充气(例如:在
ListView
中的行)和
mGlobalInflater
AlertDialog
中的视图进行充气(使用
setView()
)。这将适用于所有API级别。

我找到的唯一可行的解决方案是:

    LayoutInflater mInflater, mGlobalInflater;
    mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= 11) {
        mGlobalInflater = mInflater;
    }
    else {
        mGlobalInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    }

现在,您可以使用
mInflater
进行正常充气(例如:在
ListView
中的行)和
mGlobalInflater
AlertDialog
中的视图进行充气(使用
setView()
)。这将适用于所有API级别。

与其发布标准膨胀代码,不如发布xml文件?这也没什么特别之处;)不久前我遇到了类似的事情。尝试在布局上显式设置textcolor。您必须为不同的api版本创建不同的布局,但我认为这就是您必须做的。没有其他方法了吗?我的意思是,我使用标准主题和简单的XML进行布局。那为什么看起来这么糟糕呢?API级别>=11时是否不再支持对话框中的膨胀视图?确实如此。文档希望人们转而使用dialogfragments,但我认为这不会有什么不同。查看是否可以在api>11的主题中指定自定义文本颜色-您可能必须为其创建样式,并在主题中设置属性,如
android:textViewStyle
或其他内容。与其发布标准充气代码,xml文件如何?这也没有什么特别之处;)不久前我遇到了类似的事情。尝试在布局上显式设置textcolor。您必须为不同的api版本创建不同的布局,但我认为这就是您必须做的。没有其他方法了吗?我的意思是,我使用标准主题和简单的XML进行布局。那为什么看起来这么糟糕呢?API级别>=11时是否不再支持对话框中的膨胀视图?确实如此。文档希望人们转而使用dialogfragments,但我认为这不会有什么不同。查看是否可以在api>11的主题中指定自定义文本颜色-您可能需要为其创建一个样式,并在主题中设置一个属性,例如
android:textViewStyle
之类。谢谢,它成功了!:)但是我调用
LayoutInflater
的方法是正确的(如文档中所述)。您只需替换上下文:
mGlobalInflater=(LayoutInflater)this.getSystemService(LAYOUT\u INFLATER\u SERVICE)
(当然,也可以省略
这个
),但是unfo