我正在努力解决这个问题很长一段时间。我搜索了解决方案,实际上有一些相关问题的建议,但没有什么真正适合我。所以,假设我想创建一个带有(长)消息,复选框和两个按钮的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();
此无效,因为如果对话框消息太长,则不会完全显示该复选框。此外,它将完全隐藏在横向模式中。
接下来尝试查找original dialog layout file(对我而言,它位于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,对话文本颜色将变为黑色并且在深色背景上不可读。 为什么?!
怎么了?怎么解决这个?我不想以编程方式将文本颜色设置为白色或黑色,这在自定义用户主题上看起来不太好。有什么建议吗?
答案 0 :(得分:19)
我遇到了同样的问题,并通过为我想要的Dialog Theme创建一个ContextThemeWrapper来解决它,并在创建AlertDialog Builder时以及在将视图膨胀到附件时使用它:
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在&#34; /values/styles.xml"中定义;对于姜饼及以下作为:
<style name="DialogBaseTheme" parent="android:Theme.Dialog"/>
然后它也在&#34; /values-v11/styles.xml"中定义;对于Honeycomb和向上使用Holo主题:
<style name="DialogBaseTheme" parent="android:Theme.Holo.Light.Dialog" />
因此,在Gingerbread上,我的自定义View的TextView会自动着色为白色,Honeycomb +会自动为Holo Light着色为黑色。
答案 1 :(得分:1)
我思考我终于找到了解决方法。在我的初始代码的基础上,这似乎解决了我的问题:
// 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。它使对话框主题分配给膨胀的布局。我希望,这最终解决了未来的问题。
答案 2 :(得分:0)
在textview内添加一个属性:
android:textColor="@color/white"
并在colors.xml内定义白色,这里面是res / values文件夹
<color name="white">#ffffff</color>
或者您可以直接添加
android:textColor="#fffff"
(虽然不推荐。建议使用以上方法。)
答案 3 :(得分:0)
您可以将自定义样式与阴影一起应用,以使文字可见,无论文字颜色如何:
<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没有相应的属性,所以你必须使用像{{3 (MagicTextView在这个问题中提到:ABentSpoon)。