更正AlertDialog中的文字颜色/外观

我在这个问题上苦苦挣扎了很长一段时间。 我寻找的解决scheme,实际上有一些相关的问题的build议,但没有真正为我工作的正确。 所以我们假设我想创build一个带有(长)消息,checkbox和两个button的AlertDialog。

// create dialog AlertDialog.Builder dlg = new AlertDialog.Builder(this); dlg.setTitle(R.string.dlg_title); dlg.setMessage(R.string.dlg_msg); // add checkbox final CheckBox checkbox = new CheckBox(this); dlg.setView(checkbox); // add buttons dlg.setPositiveButton(...); dlg.setNegativeButton(...); // show dialog dlg.show(); 

这是行不通的 ,因为如果对话信息变得太长,checkbox将不会完全显示。 另外,它将完全隐藏在横向模式下。

接下来尝试查找原始对话框布局文件 (对于我来说,它位于android-sdk-linux_86 / platforms / android-17 / data / res / layout / alert_dialog.xml下)并尝试复制相关部分以创build我们的拥有内部对话框布局的“克隆”,就像这样:

dialog_checkbox.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" > <ScrollView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:overScrollMode="ifContentScrolls" android:paddingBottom="12dip" android:paddingLeft="14dip" android:paddingRight="10dip" android:paddingTop="2dip" > <TextView android:id="@+id/message" style="?android:attr/textAppearanceMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dip" /> </ScrollView> <CheckBox android:id="@+id/checkbox" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 

我们可以尝试将这个视图添加到我们的对话框中:

 // create dialog AlertDialog.Builder dlg = new AlertDialog.Builder(this); dlg.setTitle(R.string.dlg_title); // add checkbox LinearLayout checkboxLayout = (LinearLayout) View.inflate(mContext, R.layout.dialog_checkbox, null); ((TextView) checkboxLayout.findViewById(R.id.message)).setText(R.string.dlg_msg); mCheckbox = (CheckBox) checkboxLayout.findViewById(R.id.checkbox); mCheckbox.setText(R.string.dlg_checkbox_msg); setView(checkboxLayout); // add buttons dlg.setPositiveButton(...); dlg.setNegativeButton(...); // show dialog dlg.show(); 

这实际上工作很好。 几乎。 我们不会看到任何问题,直到我们使用Theme.Light为我们的应用程序。 但是,只要我们使用Theme.Light,对话文本的颜色将变黑,在黑暗的背景下无法阅读。 为什么?!

  • 我们克隆了原始的Android alert对话框的xml布局源代码。 但是,尽pipe我们使用attr / textAppearanceMedium作为文本样式,但Theme.Light下的文本颜色变为黑色。
  • 如果我们使用Theme.Light并通过setMessage创build一个具有正常消息的“正常”对话框,则文本颜色是白色的并且是可读的。

怎么了? 如何解决这个问题? 我不想以编程方式将文本颜色设置为白色或黑色,这在自定义用户主题上看起来不太好。 有什么build议么?

我有同样的问题,并通过创build一个ContextThemeWrapper为我所需的对话框主题解决它,并使用此创buildAlertDialog生成器时,并在充气视图附加:

 ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.DialogBaseTheme); AlertDialog.Builder builder = new AlertDialog.Builder(wrapper); View view = LayoutInflater.from(wrapper).inflate(R.layout.create_warning, null); builder.setView(view); 

风格R.style.DialogBaseTheme在姜饼的“/values/styles.xml”中定义如下:

 <style name="DialogBaseTheme" parent="android:Theme.Dialog"/> 

然后在“/values-v11/styles.xml”中为Honeycomb定义,并向上使用Holo主题:

 <style name="DialogBaseTheme" parent="android:Theme.Holo.Light.Dialog" /> 

所以姜饼我的自定义视图的TextViews自动彩色白色和蜂窝+他们自动黑色全彩光。

我想我终于find了如何解决它。 在我最初的代码的基础上,这似乎解决了我的问题:

 // add checkbox layout LinearLayout checkboxLayout = (LinearLayout) View.inflate(new ContextThemeWrapper(context, android.R.style.Theme_Dialog), R.layout.dialog_checkbox, null); ((TextView) checkboxLayout.findViewById(R.id.message)).setText(DIALOG_TEXT); mCheckbox = (CheckBox) checkboxLayout.findViewById(R.id.checkbox); mCheckbox.setText(CHECKBOX_NOT_AGAIN); setView(checkboxLayout); 

请注意ContextThemeWrapper。 它使对话框主题被分配到膨胀的布局。 我希望这最终能够解决这个问题。

在textview中添加一个属性:

 android:textColor="@color/white" 

并在res / values文件夹中定义colors.xml内的白色

 <color name="white">#ffffff</color> 

或者你可以直接添加

android:textColor="#fffff" (虽然不推荐使用,但build议使用上述方法。)

您可以使用阴影应用自定义样式 ,以使文本可以显示为任何文本颜色:

 <resources> <style name="Text.Shaded.Medium" parent="@android:attr/textAppearanceMedium"> <item name="@android:paddingLeft">4dp</item> <item name="@android:paddingBottom">4dp</item> <item name="@android:textColor">#FFFFFFFF</item> <item name="@android:shadowColor">#000000</item> <item name="@android:shadowDx">2</item> <item name="@android:shadowDy">2</item> <item name="@android:shadowRadius">2</item> </style> </resources> 

但是,如果它对于你来说不够明显,你可以应用一个内部的阴影,但不幸的是Android没有这个属性,所以你将不得不使用类似MagicTextView (在这个问题中提到的ABentSpoon : 有没有办法将内部阴影添加到Android上的TextView? )。