我如何改变默认对话框按钮的文本颜色在安卓5

我有很多警报对话框在我的应用程序。这是一个默认的布局,但我添加了积极和消极的按钮对话框。所以按钮得到Android 5的默认文本颜色(绿色)。我试图改变它,但没有成功。知道怎么改变文字的颜色吗?

自定义对话框:

public class MyCustomDialog extends AlertDialog.Builder {


public MyCustomDialog(Context context,String title,String message) {
super(context);


LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
View viewDialog = inflater.inflate(R.layout.dialog_simple, null, false);


TextView titleTextView = (TextView)viewDialog.findViewById(R.id.title);
titleTextView.setText(title);
TextView messageTextView = (TextView)viewDialog.findViewById(R.id.message);
messageTextView.setText(message);


this.setCancelable(false);


this.setView(viewDialog);


} }

创建对话框:

MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage);
builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
...
}
}).show();

那个negativeButton是一个默认的对话框按钮,并采用Android 5 Lollipop的默认绿色。

非常感谢

自定义对话框与绿色按钮

205574 次浏览

您可以尝试先创建AlertDialog对象,然后使用它来设置更改按钮的颜色,然后显示它。(注意,在builder对象上,我们调用create()来获得AlertDialog对象,而不是调用show():

//1. create a dialog object 'dialog'
MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage);
AlertDialog dialog = builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {


@Override
public void onClick(DialogInterface dialogInterface, int i) {
...
}


}).create();


//2. now setup to change color of the button
dialog.setOnShowListener( new OnShowListener() {
@Override
public void onShow(DialogInterface arg0) {
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(COLOR_I_WANT);
}
});


dialog.show()

你必须在onShow()上这样做,而不能在你创建对话框后得到那个按钮的原因是这个按钮还没有被创建。

我将AlertDialog.BUTTON_POSITIVE改为AlertDialog.BUTTON_NEGATIVE以反映你的问题中的变化。虽然“OK”键是否定键有点奇怪。通常是正面按钮。

最简单的解决方案是:

dialog.show(); //Only after .show() was called
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(neededColor);
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(neededColor);

按钮和其他文本的颜色也可以通过主题来改变:

values-21 / styles.xml

<style name="AppTheme" parent="...">
...
<item name="android:timePickerDialogTheme">@style/AlertDialogCustom</item>
<item name="android:datePickerDialogTheme">@style/AlertDialogCustom</item>
<item name="android:alertDialogTheme">@style/AlertDialogCustom</item>
</style>


<style name="AlertDialogCustom" parent="android:Theme.Material.Light.Dialog.Alert">
<item name="android:colorPrimary">#00397F</item>
<item name="android:colorAccent">#0AAEEF</item>
</style>

结果:

Dialog Date picker .

<style name="AlertDialogCustom" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:colorPrimary">#00397F</item>
<item name="android:textColorPrimary">#22397F</item>
<item name="android:colorAccent">#00397F</item>
<item name="colorPrimaryDark">#22397F</item>
</style>

按钮和其他文本的颜色也可以使用appcompat更改:

如果你想改变按钮的文本颜色(正面,负面,中性),只需添加到您的自定义对话框样式:

<item name="colorAccent">@color/accent_color</item>

所以,你的对话框样式必须是这样的:

<style name="AlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:textColor">@android:color/black</item>
<item name="colorAccent">@color/topeka_accent</item>
</style>

顺便说一句:

按钮的颜色(和整个样式)也取决于当前的主题,当你使用它们的时候可能会有很大的不同

android.app.AlertDialog.Builder builder = new AlertDialog.Builder()

android.support.v7.app.AlertDialog.Builder builder = new AlertDialog.Builder()

(用第二个更好)

下面是一种使用样式的自然方法:

如果你的AppTheme继承自Theme.MaterialComponents,那么:

<style name="AlertDialogTheme" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
<item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
<item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>


<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
<item name="android:textColor">#f00</item>
</style>


<style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
<item name="android:textColor">#00f</item>
</style>

如果你的AppTheme继承自Theme.AppCompat:

<style name="AlertDialogTheme" parent="ThemeOverlay.AppCompat.Dialog.Alert">
<item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
<item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>


<style name="NegativeButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
<item name="android:textColor">#f00</item>
</style>


<style name="PositiveButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
<item name="android:textColor">#00f</item>
</style>

AppTheme中使用AlertDialogTheme

<item name="alertDialogTheme">@style/AlertDialogTheme</item>

或者在构造函数中

androidx.appcompat.app.AlertDialog.Builder(context, R.style.AlertDialogTheme)

或者如果你正在使用MaterialAlertDialogBuilder,那么使用

<item name="materialAlertDialogTheme">@style/AlertDialogTheme</item>

对我来说就不同了,我使用的是按钮主题

<style name="ButtonLight_pink" parent="android:Widget.Button">
<item name="android:background">@drawable/light_pink_btn_default_holo_light</item>
<item name="android:minHeight">48dip</item>
<item name="android:minWidth">64dip</item>
<item name="android:textColor">@color/tab_background_light_pink</item>
</style>
因为android:textColor是白色的,所以我没有看到任何按钮文本(对话框按钮基本上也是按钮)。 好了,修改了,修正了

有两种方法可以更改对话框按钮的颜色。

基本的方法

如果你只是想改变一个活动,将下面两行写在alertDialog.show();之后

alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorPrimary));
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorPrimaryDark));

推荐

我建议在styles.xml中为AlertDialog添加一个主题,这样你就不必在每个活动/对话调用中一次又一次地编写相同的代码。您只需创建一个样式,并在对话框上应用该主题。所以当你想要改变AlertDialog框的颜色时,只要在styles.xml中改变颜色,所有的对话框都会在整个应用程序中更新。

<style name="AlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="colorAccent">@color/colorPrimary</item>
</style>

并在AlertDialog.Builder中应用主题

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme);
  1. 在你的应用程序的主题/风格中,添加以下行:

    <item name="android:buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="android:buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <item name="android:buttonBarNeutralButtonStyle">@style/NeutralButtonStyle</item>
    
  2. Then add the following styles:

    <style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">@color/red</item>
    </style>
    
    
    <style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">@color/red</item>
    </style>
    
    
    <style name="NeutralButtonStyle"
    parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#00f</item>
    </style>
    

Using this method makes it unneccessary to set the theme in the AlertDialog builder.

你可以这样做:简单的方法

// Initializing a new alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.message);
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
doAction();
}
});
builder.setNegativeButton(R.string.cancel, null);


// Create the alert dialog and change Buttons colour
AlertDialog dialog = builder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface arg0) {
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.red));
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.blue));
//dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(getResources().getColor(R.color.black));
}
});
dialog.show();

Kotlin 2020:非常简单的方法

dialog.show()使用后:

dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(requireContext(), R.color.yourColor))

使用styles.xml(值)

非常简单的解决方案,改变colorPrimary作为您的选择,它将改变按钮文本的警告框的颜色。

<style name="MyAlertDialogStyle" parent="android:Theme.Material.Dialog.Alert">




<!-- Used for the buttons -->
<item name="colorAccent">@android:color/white</item>
<!-- Used for the title and text -->
<item name="android:textColorPrimary">@color/black</item>


<!-- Used for the background -->
<item name="android:background">#ffffff</item>
<item name="android:colorPrimary">@color/white</item>
<item name="android:colorAccent">@color/white</item>
<item name="android:windowEnterAnimation">@anim/bottom_left_enter</item>
</style>

替代(使用Java)

 @SuppressLint("ResourceAsColor")
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {


AlertDialog dialog = new AlertDialog.Builder(view.getContext(), R.style.MyAlertDialogStyle)


.setTitle("Royal Frolics")
.setIcon(R.mipmap.ic_launcher)
.setMessage(message)
.setPositiveButton("OK", (dialog1, which) -> {
//do nothing
result.confirm();
}).create();


Objects.requireNonNull(dialog.getWindow()).getAttributes().windowAnimations = R.style.MyAlertDialogStyle;
dialog.show();
                

dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(R.color.white);
return true;


}

我们可以创建扩展函数,并在Dialog .show()之后调用扩展函数来定制警报对话框按钮的颜色。

fun AlertDialog.makeButtonTextBlue() {
this.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(context, R.color.blue))
this.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(context, R.color.blue))
}

用法:

dialog.show()
dialog.makeButtonTextBlue()

快速简单的方法: 更改res/values/colors.xml中的colorAccent颜色,颜色以十六进制表示,例如#010613为黑色。 拜拜< / p >

这是一个自定义主题来改变AlertDialog按钮的textColor。 它在我的设备上工作-三星ga70 -安卓11

<style name="AlertDialogCustom" parent="Theme.AppCompat.Light.Dialog.Alert">
<!--Support for other devices, I think so-->
<item name="android:textColor">@color/yourcolor</item>
<item name="colorButtonNormal">@color/yourcolor</item>
<item name="colorAccent">@color/yourcolor</item>
<!--only this code works on my device-->
<item name="buttonBarButtonStyle">@style/MyButtonStyle</item>
</style>


<!--only this code works on my device-->
<style name="MyButtonStyle" parent="Widget.AppCompat.Button.Borderless">
<item name="android:textColor">@color/yourcolor</item>
</style>

在学习的同时又看了很多造型。要知道的一件重要的事情是,代码比样式更高级。按键的样式并不适用,所以我感谢Ramakrishna Joshi在这篇文章中的回答。我在其中添加了白天和夜晚的主题:

private fun AlertDialog.dlgTextColor() {
val currentNightMode = (resources.configuration.uiMode
and Configuration.UI_MODE_NIGHT_MASK)
when (currentNightMode) {
Configuration.UI_MODE_NIGHT_YES -> {
this.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(context, R.color.yellow_accent))
this.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(context, R.color.yellow_accent))
}
Configuration.UI_MODE_NIGHT_NO -> {
this.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(context, R.color.blue_accent))
this.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(context, R.color.blue_accent))
}
}
}

对它的调用是:

.dlgTextColor()

在对话构建器中,对该方法的调用确实跟在.show之后。

以下是@trungdinhtrong接受的答案的Kotlin版本:

val alert = builder.create()
if (button1Text == "Delete") {
alert.setOnShowListener { dialog ->
alert.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.RED);
}
}

顺便说一句,似乎Android的“积极”理念;和“;negative"按钮与“安全”的理念不兼容。和“;destructive"按钮。在带有取消和删除按钮的对话框中,我认为Android会考虑删除积极按钮,因为它执行了一个动作,但我认为它是一个破坏性按钮,因为它会导致数据丢失。因此,我没有使用样式文件来设置正面和负面按钮的颜色,而是使用下面的代码将删除按钮设置为红色,尽管它是“正面”按钮。按钮。