You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

创建一个专属主题,覆盖按钮颜色属性,不会影响全局主题。

  1. 在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> -->
  1. 创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 19:10:29