如何修改DialogFragment中按钮的颜色(Android Java实现)
自定义AlertDialog按钮颜色(不修改全局colorPrimary)
我有如下Java类:
public class DatePickerFragment extends DialogFragment { private Calendar date; @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { DatePicker datePicker = new DatePicker(getActivity()); date = Calendar.getInstance(); return new AlertDialog.Builder(getActivity()) .setView(datePicker) .setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { date.set(Calendar.YEAR, datePicker.getYear()); date.set(Calendar.MONDAY, datePicker.getMonth()); // 此处应为Calendar.MONTH,属于笔误 date.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth()); ((SigninActivity)getActivity()).doPositiveClick(date); } } ) .setNegativeButton("Back", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dismiss(); } }) .create(); } }
注:代码里Calendar.MONDAY是笔误,得改成Calendar.MONTH,不然月份设置会出错。
我想修改“Ok”和“Back”这两个按钮的颜色,当前按钮用的是themes.xml里的colorPrimary颜色,但不想修改全局的colorPrimary属性,只想单独自定义这两个按钮的颜色,该怎么设置?
调用该日期选择器的代码如下:
data.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new DatePickerFragment().show(getSupportFragmentManager(), DatePickerFragment.TAG); } });
解决方法
方法一:创建Dialog后直接设置按钮颜色
先创建AlertDialog对象,在Dialog显示时获取正、负按钮,然后设置自定义颜色。修改后的onCreateDialog方法如下:
@NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { DatePicker datePicker = new DatePicker(getActivity()); date = Calendar.getInstance(); // 先构建AlertDialog实例 AlertDialog alertDialog = new AlertDialog.Builder(getActivity()) .setView(datePicker) .setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { date.set(Calendar.YEAR, datePicker.getYear()); date.set(Calendar.MONTH, datePicker.getMonth()); date.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth()); ((SigninActivity)getActivity()).doPositiveClick(date); } } ) .setNegativeButton("Back", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dismiss(); } }) .create(); // 在Dialog显示时设置按钮颜色,确保按钮已初始化 alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { // 从资源文件取自定义颜色,也可以用Color.parseColor("#FF0000")直接写色值 int positiveColor = ContextCompat.getColor(requireContext(), R.color.your_positive_color); int negativeColor = ContextCompat.getColor(requireContext(), R.color.your_negative_color); alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(positiveColor); alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(negativeColor); } }); return alertDialog; }
需要先在res/values/colors.xml里定义颜色:
<color name="your_positive_color">#FF4081</color> <color name="your_negative_color">#757575</color>
方法二:自定义局部主题,仅作用于该Dialog
创建一个专属主题,覆盖按钮颜色属性,不会影响全局主题。
- 在
res/values/themes.xml中添加自定义主题:
<!-- 如果你用MaterialComponents主题 --> <style name="CustomDatePickerDialogTheme" parent="Theme.MaterialComponents.Dialog.Alert"> <!-- 正按钮颜色 --> <item name="colorPrimary">@color/your_positive_color</item> <!-- 负按钮颜色 --> <item name="colorOnSurface">@color/your_negative_color</item> </style> <!-- 如果你用AppCompat主题,用下面这个 --> <!-- <style name="CustomDatePickerDialogTheme" parent="Theme.AppCompat.Dialog.Alert"> <item name="android:colorAccent">@color/your_positive_color</item> <item name="android:textColorSecondary">@color/your_negative_color</item> </style> -->
- 创建AlertDialog.Builder时传入这个主题:
@NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { DatePicker datePicker = new DatePicker(getActivity()); date = Calendar.getInstance(); // 使用自定义主题构建Builder AlertDialog.Builder builder = new AlertDialog.Builder(requireContext(), R.style.CustomDatePickerDialogTheme); return builder.setView(datePicker) .setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { date.set(Calendar.YEAR, datePicker.getYear()); date.set(Calendar.MONTH, datePicker.getMonth()); date.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth()); ((SigninActivity)getActivity()).doPositiveClick(date); } } ) .setNegativeButton("Back", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dismiss(); } }) .create(); }
内容的提问来源于stack exchange,提问作者astra
相关产品推荐
相关产品推荐

