Android 在安卓4.X上无法读取膨胀的AlertDialogs,而在安卓2.X上则看起来非常完美
为了显示包含丰富内容和输入元素的对话框,我使用Android的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:这是我用于
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