我在应用程序中有一个警告对话框,如下所示。
我想要标题和分隔标题的行 - 消息正文为橙色。我怎样才能做到这一点? 我尝试使用自定义样式,如下所示。但这没效果。
<style name="AboutDialog" parent="@android:style/Theme.Dialog">
<item name="android:textColor">#E5492A</item>
</style>
我的提醒对话框代码:
AlertDialog.Builder alertDialog = new AlertDialog.Builder( new ContextThemeWrapper(MainActivity.context, R.style.AboutDialog));
alertDialog.setTitle("Sample");
alertDialog.setMessage(R.string.rate_dialog_text);
alertDialog.setPositiveButton(R.string.rate_now_text,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
MainActivity.context.startActivity(new Intent(
Intent.ACTION_VIEW, Uri
.parse("market://details?id="
+ MainActivity.APP_PNAME)));
if (editor != null) {
editor.putBoolean("dontshowagain", true);
editor.commit();
}
dialog.dismiss();
}
});
alertDialog.setNeutralButton(R.string.remind_later_text,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.setNegativeButton(R.string.no_thanks_text,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (editor != null) {
editor.putBoolean("dontshowagain", true);
editor.commit();
}
dialog.dismiss();
}
});
return alertDialog.create();
}
答案 0 :(得分:18)
而不是:
AlertDialog.Builder alertDialog = new AlertDialog.Builder(
new ContextThemeWrapper(MainActivity.context, R.style.AboutDialog));
试试这个:
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this, R.style.AboutDialog);
注意:这仅适用于API 11(Android 3.0)及更高版本。
如果您需要支持Android&lt; 3.0你可能需要创建一个自定义对话框(而不是使用AlertDialog
编辑添加了非常低级的基于反射的黑客
如果您确实陷入困境并且不想实现自定义对话框,请尝试以下操作。
在您构建对话框之后,在您想要返回它之前,而不是:
return alertDialog.create();
这样做:
AlertDialog ad = alertDialog.create(); // Create the dialog
// Add listener so we can modify the dialog before it is shown
ad.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialogInterface) {
// Set the text color on the dialog title and separator
setTextColor(dialogInterface, 0xFFE5492A);
}
});
return ad;
现在添加这个非常讨厌的基于反射的方法:
public void setTextColor(DialogInterface alert, int color) {
try {
Class c = alert.getClass();
Field mAlert = c.getDeclaredField("mAlert");
mAlert.setAccessible(true);
Object alertController = mAlert.get(alert);
c = alertController.getClass();
Field mTitleView = c.getDeclaredField("mTitleView");
mTitleView.setAccessible(true);
Object dialogTitle = mTitleView.get(alertController);
TextView dialogTitleView = (TextView)dialogTitle;
// Set text color on the title
dialogTitleView.setTextColor(color);
// To find the horizontal divider, first
// get container around the Title
ViewGroup parent = (ViewGroup)dialogTitleView.getParent();
// Then get the container around that container
parent = (ViewGroup)parent.getParent();
for (int i = 0; i < parent.getChildCount(); i++) {
View v = parent.getChildAt(i);
if (v instanceof ImageView) {
// We got an ImageView, that should be the separator
ImageView im = (ImageView)v;
// Set a color filter on the image
im.setColorFilter(color);
}
}
} catch (Exception e) {
// Ignore any exceptions, either it works or it doesn't
}
}
我在Android 2.2和Android 4.0上对此进行了测试,但它确实有效。它可能不完全符合您的要求,因此您需要尝试它。我不能保证它可以在所有设备或未来版本的Android上运行,因为它在很大程度上取决于AlertDialog
类的实现方式(如果它们将来改变它可能不再适用) )。
对于任何关心的人来说,只需几个笔记:
我使用setOnShowListener()
的原因是因为您实际上无法访问View
使用的内部AlertDialog
对象,直到它们被夸大。创建AlertDialog
时,它们不会立即膨胀,它会在一段时间后发生。使用监听器,我们可以在布局膨胀之后但在显示Dialog
之前获得控制权。
我正在使用反射来访问AlertDialog
实现中的内部成员变量。一旦我访问了包含标题的TextView
,我就必须四处寻找用于将标题与消息分开的水平线。为此,我得到了标题周围的Layout
(此Layout
包含警报图标和标题文字)。然后我得到周围的Layout
(这个Layout
包装图标,标题文本和分隔符)。然后我查看周围布局的所有子项,并在其中的所有ImageView
个对象上设置颜色。分隔符使用drawable实现为ImageView
,因此无法仅更改颜色。注意:使用setColorFilter()
的替代方法是使用适当颜色的drawable替换ImageView中的drawable。
感谢您的挑战,想出这个很有趣:-D
答案 1 :(得分:2)
final AlertDialog.Builder demoDialog = new AlertDialog.Builder(this);
final LayoutInflater inflator = this.getLayoutInflater();
final View view = inflator.inflate(R.layout.passcode_req_dialog_template, null);
demoDialog.setView(view)
.setPositiveButton(R.string.ok_button_text, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton(R.string.cancel_button_text, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
final AlertDialog dialog = passwordDialog.create();
dialog.show();
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Get the work done here when pressing positive button
dialog.dismiss();
}
});
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Get the work done here when pressing negative button
dialog.dismiss();
}
});
答案 2 :(得分:1)
尝试为对话框创建custom layout
,并使用
layout
提供给警报对话框
dialog.setContentView(R.layout.customDialogLayout);
您可以在自定义对话框中看到此example。
答案 3 :(得分:0)
您可以使用此项目AlertDialogPro。 将此项目包含在您的项目中并定义您的主题,如下所示:
<style name="YourAppTheme.AlertDialogProTheme" parent="AlertDialogProTheme.Holo.Light">
<!-- Custom the title -->
<item name="android:windowTitleStyle">@style/YourDialogWindowTitle</item>
<!-- Change the title line to orange -->
<item name="adpTitleDividerBackground">#E5492A</item>
</style>
<style name="YourDialogWindowTitle" parent="DialogWindowTitle.Holo.Light">
<item name="android:textColor">#E5492A</item>
</style>
并使用属性&#34; alertDialogProTheme&#34;
为您应用的主题指定此主题<style name="AppTheme" parent="AppBaseTheme">
...
<item name="alertDialogProTheme">@style/YourAppTheme.AlertDialogProTheme</item>
</style>
使用AlertDialogPro.Builder构建对话框:
AlertDialogPro.Builder builder = new AlertDialogPro.Builder(getContext());
builder.setTitle(R.string.app_name).
setMessage("Message").
setPositiveButton("Rate Now", null).
setNeutralButton("Remind me later", null).
setNegativeButton("No,thanks", null).
show();