Android:从Theme.Light活动中显示对话框的问题

7
我正在尝试从一个设置为Theme.Light的PreferenceActivity中显示对话框,但是对话框上显示的文字是黑色的,背景也是黑色的。我认为它使用黑色文本是因为它从父Activity中继承了文本颜色或类似的东西。当设置为Theme.Light时,我希望对话框要么在黑色背景上使用白色文本,要么在白色背景上使用黑色文本,就像PreferenceActivity一样。
这似乎是一个已知的问题,我发现的解决方法涉及创建和使用一个扩展Theme.Dialog的自定义样式,并使用它来实例化对话框。大致如下:
<style name="CustomDialog" parent="@android:style/Theme.Dialog">
<item name="android:textColor">?android:attr/textColorPrimaryInverseDisableOnly</item>
</style>

Dialog dialog = new Dialog(context, R.style.CustomDialog);

我尝试了这个,但是没有任何改变。我也尝试了多个不同的textColor值,但是都无法修改对话框的文本颜色。为了验证,我添加了以下内容:

     <item name="android:background">#FFFF0000</item>

为了样式的需求,我创建了一个红色背景的对话框(所以我确信我已经正确地实例化了对话框)。

我找到的最接近解决方案就是将对话框的背景颜色设置为白色,这样就得到了下面的对话框。但这并不是一个好的解决方案,因为某些版本或某些设备可能会在反转文本颜色时使用不同的行为:

enter image description here

那么,在从Theme.Light活动显示的对话框中设置文本颜色的好方法是什么呢?


我记得曾经也遇到类似的问题,但最终没有解决。我的解决方法是创建多个值资源文件,其中一个将Gingerbread版本中的颜色定义为黑暗色(在res/values-v8中),而在其他版本(在res/values中)中则定义为浅色。 - Reuben Scratton
我的诱惑是将列表的背景硬编码为白色,将列表的文本颜色设为黑色。希望这样可以保证在任何设备或版本上都能得到黑色文本和白色背景。 - ab11
嗯,那肯定可以。但我认为这个痛点的重点是要与设备主题融合...姜饼版本比早期版本要暗得多,因此它是特例。 - Reuben Scratton
你在哪个设备上运行你的应用程序?它使用的是哪个版本的Android系统? - Malcolm
1个回答

1

我假设您使用了AlertDialog.Builder并使用其中一个setSingleChoiceItems方法设置列表,该方法不使用您自己的ListAdapter。相反,它会创建自己的适配器,并使用错误的样式。要解决此问题,您应该调用setSingleChoiceItems(ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener)并提供这样一个适配器,该适配器将使用所需样式的布局。

现在,为什么会发生这种情况呢?实际的适配器创建发生在文件com.android.internal.app.AlertController中,其中以下行选择单选列表的布局:

int layout = mIsSingleChoice 
                    ? R.layout.select_dialog_singlechoice : R.layout.select_dialog_item;

这是上述的布局:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="@android:color/primary_text_light_disable_only"
    android:gravity="center_vertical"
    android:paddingLeft="12dip"
    android:paddingRight="7dip"
    android:checkMark="@android:drawable/btn_radio"
    android:ellipsize="marquee"
/>

正如您所看到的,设置文本颜色的行不包含对主题的引用,而是包含硬编码的颜色。这就是为什么当此项在列表创建期间被填充时,它将始终使用相同的颜色,无论您想要使用什么样式。因此,克服此问题的正确方法是使用自己的布局和自己的ListAdapter


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