Change button color in AlertDialog
如何在Android中的
我就是这样做的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | AlertDialog.Builder customBuilder = new AlertDialog.Builder(new ContextThemeWrapper(this,android.R.style.Theme_Dialog)); customBuilder.setTitle(R.string.popup_error_title); customBuilder.setNegativeButton("Exit application", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { MyActivity.this.finish(); } }); AlertDialog dialog = customBuilder.create(); dialog.show(); Button b = dialog.getButton(DialogInterface.BUTTON_NEGATIVE); if(b != null) { b.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_button)); } |
我在这里找到了可绘制的
由于大多数人现在可能正在使用DialogFragment,我遇到了一些问题并点击了我的方式通过几个SO答案来解决这些问题。让我发布我目前的解决方案。
我最后设置了自定义drawables的按钮背景已经多次建议。但是,在
至于边距:简单地删除Drawable-XML中用于按钮的填充。
DialogFragment中的#onCreateDialog:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // setup your dialog here... builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { // do something } }); builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { // do something } }); final AlertDialog dialog = builder.create(); dialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(final DialogInterface dialog) { Button negativeButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEGATIVE); Button positiveButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_POSITIVE); // this not working because multiplying white background (e.g. Holo Light) has no effect //negativeButton.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY); final Drawable negativeButtonDrawable = getResources().getDrawable(R.drawable.alert_dialog_button_light_red); final Drawable positiveButtonDrawable = getResources().getDrawable(R.drawable.alert_dialog_button_light_green); if (Build.VERSION.SDK_INT >= 16) { negativeButton.setBackground(negativeButtonDrawable); positiveButton.setBackground(positiveButtonDrawable); } else { negativeButton.setBackgroundDrawable(negativeButtonDrawable); positiveButton.setBackgroundDrawable(positiveButtonDrawable); } negativeButton.invalidate(); positiveButton.invalidate(); } }); return dialog; } |
按钮的Drawable-XML示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape> <gradient android:startColor="@color/alert_dialog_button_green_pressed1" android:endColor="@color/alert_dialog_button_green_pressed2" android:angle="270" /> </shape> </item> <item android:state_focused="true"> <shape> <gradient android:endColor="@color/alert_dialog_button_green_focused1" android:startColor="@color/alert_dialog_button_green_focused2" android:angle="270" /> </shape> </item> <item> <shape> <gradient android:endColor="@color/alert_dialog_button_green1" android:startColor="@color/alert_dialog_button_green2" android:angle="270" /> </shape> </item> </selector> |
不要忘记在
1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="utf-8"?> <resources> <color name="alert_dialog_button_green1">#b4099930</color> <color name="alert_dialog_button_green2">#b4099930</color> <color name="alert_dialog_button_green_focused1">#96099930</color> <color name="alert_dialog_button_green_focused2">#96099930</color> <color name="alert_dialog_button_green_pressed1">#96099930</color> <color name="alert_dialog_button_green_pressed2">#96099930</color> </resources> |
我通过这段代码完成了它可能对你有所帮助:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | AlertDialog.Builder builder1 = new AlertDialog.Builder(this); builder1.setCancelable(true); builder1.setTitle("abc"); builder1.setMessage("abcdefg"); builder1.setInverseBackgroundForced(true); builder1.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); builder1.setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert11 = builder1.create(); alert11.show(); Button buttonbackground = alert11.getButton(DialogInterface.BUTTON_NEGATIVE); buttonbackground.setBackgroundColor(Color.BLUE); Button buttonbackground1 = alert11.getButton(DialogInterface.BUTTON_POSITIVE); buttonbackground1.setBackgroundColor(Color.BLUE); |
我想用主题而不是额外的代码来解决这个问题,因为在styles.xml中拥有所有与样式相关的东西对我来说感觉更干净。我所做的是基于Arade的答案和另一个问题:
1 2 3 | <style name="AlertDialogDanger" parent="Theme.AppCompat.Light.Dialog.Alert"> <item name="colorAccent">@color/error</item> </style> |
这将更改您使用样式
1 2 3 4 5 | new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogDanger)) .setMessage("Really delete?") .setPositiveButton("Delete", null) .setNegativeButton("Cancel", null) .create().show(); |
这是一些例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | AlertDialog.Builder b = new AlertDialog.Builder(all.this); b.setMessage("r u wan't 2 exit"); b.setCancelable(false); b.setNegativeButton("no", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); b.setPositiveButton("yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Intent i=new Intent(getBaseContext(), s.class); startActivity(i); } }); AlertDialog a=b.create(); a.show(); Button bq = a.getButton(DialogInterface.BUTTON_NEGATIVE); bq.setBackgroundColor(Color.BLUE); |
我们可以使用Style更改警告对话框按钮文本颜色。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | AlertDialog.Builder dialog = new AlertDialog.Builder(context, R.style.yourDialog); dialog.setTitle(R.string.title); dialog.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { //code here } }); dialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { //do here } }); dialog.show(); |
Style.xml
1 2 3 4 5 6 | <style name="yourDialog" parent="Theme.AppCompat.Light.Dialog.Alert"> <item name="android:colorAccent">@color/themeColor</item> <item name="android:colorPrimary">@color/themeColor</item> </style> |
1 2 3 4 5 6 7 8 9 10 11 12 13 | //el resto AlertDialog a=alertDialog.create(); cambiar_color_texto_alertdialog(a); } public void cambiar_color_texto_alertdialog(AlertDialog a){ a.show(); Button BN = a.getButton(DialogInterface.BUTTON_NEGATIVE); BN.setTextColor(parseColor("#2E9AFE")); Button BA = a.getButton(DialogInterface.BUTTON_POSITIVE); BA.setTextColor(parseColor("#2E9AFE")); } |
我认为有开发人员希望扩展AlertDialog类并使用类定义定义按钮颜色。为此,您可以使用以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class MyDialog extends AlertDialog { public MyDialog(final Context context) { super(context); setOnShowListener(new OnShowListener() { @Override public void onShow(DialogInterface dialog) { Button negativeButton = getButton(DialogInterface.BUTTON_NEGATIVE); Button positiveButton = getButton(DialogInterface.BUTTON_POSITIVE); negativeButton.setBackgroundColor(Color.GREEN); positiveButton.setBackgroundColor(Color.RED); } }); } } |
如果您正在使用DialogFragment(android.app.DialogFragment),那么您可以覆盖onStart方法以获取所有按钮的处理(正,负和中性)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); View eventEditDialogView = View.inflate(this.getActivity(), R.layout.event_edit_dialog, null); builder.setTitle(getLocalizedString("edit_event")) .setView(eventEditDialogView) .setPositiveButton(getLocalizedString("all_events"), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { } }) .setNegativeButton(getLocalizedString("this_event"), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }) return builder.create(); } @Override public void onStart() { super.onStart(); Button positive = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE); positive.setTextColor(Color.BLACK); positive.setBackgroundColor(getResources().getColor(R.color.GrayBGColor)); } |
以上所有解决方案都适用于在相同活动或片段上创建的AlertDialog或Dialog,但不能单独创建DialogFragment。
使用appcompat也可以更改按钮和其他文本的颜色:
1 2 3 4 5 6 | <style name="AlertDialogCustom" parent="Theme.AppCompat.Light.Dialog.Alert"> <item name="android:colorPrimary">@color/flexdrive_blue_1</item> <item name="android:textColorPrimary">@color/flexdrive_blue_6</item> <item name="android:colorAccent">@color/flexdrive_blue_1</item> <item name="colorPrimaryDark">@color/flexdrive_blue_4</item> </style> |
更改AlertDailog的按钮颜色
码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // Initialize AlertDialog & AlertDialog Builder AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this); builder.setTitle(R.String.AlertDialogTitle); ........... ......... //Build your AlertDialog AlertDialog Demo_alertDialog= builder.create(); Demo_alertDialog.show(); //For Positive Button: Button b_pos; b_pos=Demo_alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); if(b_pos!=null){ b_pos.setTextColor(getResources().getColor(R.color.YourColor)); } //For Neutral Button: Button b_neu; b_neu=Demo_alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL); if(b_neu!=null){ b_neu.setTextColor(getResources().getColor(R.color.YourColor)); } //For Negative Button: Button b_neg; b_neg=Demo_alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE); if(b_neg!=null){ b_neg.setTextColor(getResources().getColor(R.color.YourColor)); } |
你不能改变警告框默认按钮的颜色或图像或背景。
对于自定义,您需要使用这样的自定义对话框。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | public class TryAgainAlert extends Dialog implements OnClickListener { @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { Intent i = new Intent(getApplicationContext(), MainMenu.class); finish(); startActivity(i); return true; } return super.onKeyDown(keyCode, event); } TextView scores; Button tryagain,mainmenu,submit; public TryAgainAlert(Context context) { super(context); setContentView(R.layout.tryagainalert); scores=(TextView)findViewById(R.id.text); tryagain= (Button) findViewById(R.id.trya); mainmenu= (Button) findViewById(R.id.submitscore); submit= (Button) findViewById(R.id.mainmenu); } @Override public void onClick(View v) { if(v == tryagain) { else if (v==mainmenu) { } else if (v == submit) { } } } |
您可以使用XML文件执行任何操作。
我希望它会有所帮助。
谢谢
你指的是中性,正面和负面按钮吗?或者您在布局中包含的按钮?
如果你指的是前者,那么你可以。查看本教程中的"自定义按钮"部分。您基本上需要一个XML文件,它将告诉您的按钮每个状态更改使用哪个drawable / color。然后,您可以将此XML文件设置为按钮的背景。