我在这个问题上挣扎了很长时间。我搜索了解决方案,实际上有一些针对相关问题的建议,但没有什么对我真正有效。因此,假设我想创建一个带有(长)消息、一个复选框和两个按钮的 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();
这不起作用,因为如果对话框消息变得太长,复选框将不会完全显示。此外,它将在横向模式下完全隐藏。
接下来的尝试是查找原始对话框布局文件(对我来说它位于 android-sdk-linux_86/platforms/android-17/data/res/layout/alert_dialog.xml 下)并尝试复制相关部分以创建我们的自己的内部对话框布局的“克隆”,就像这样:
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 警报对话框 xml 布局源代码。但是虽然我们使用 attr/textAppearanceMedium 作为文字样式,但是在 Theme.Light 下文字颜色还是变成了黑色。
- 如果我们使用 Theme.Light 并通过 setMessage 创建一个带有普通消息的“普通”对话框,则文本颜色为白色且可读。
怎么了?如何解决这个问题?我不想以编程方式将文本颜色设置为白色或黑色,这在自定义用户主题上看起来不太好。有什么建议么?