如何在所有版本中自定义AlertDialog的样式?

时间:2013-05-14 12:29:03

标签: android styles

我尝试为警报对话框制作自定义样式,该样式将适用于2.2到4.2版本的acros。我发现的最佳方法是使用

AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogCustom));

然而,API 11中提供的版本不适用于早于此版本的版本。您能否建议使用自定义样式实现警报对话框的无痛方法?感谢。

2 个答案:

答案 0 :(得分:0)

我不知道无痛,但这是一种符合我经验的方式:

1)创建自定义视图或布局,并通过builder.setView(view)在构建器上进行设置。

2)如果你有AlertDialog按钮 - 那些不是自定义视图的一部分,它们会为DialogInterface.OnClickListener而不是View.OnClickListener激活事件。因此,如果您需要设置样式,则必须在创建实际警报时动态执行此操作:

    alert = builder.create();
    alert.setOnShowListener(new DialogInterface.OnShowListener()
    {
        @Override
        public void onShow(DialogInterface dialog)
        {
            Button btnPositive = alert.getButton(Dialog.BUTTON_POSITIVE);
            // set custom stuff for your positive button

            Button btnNegative = alert.getButton(Dialog.BUTTON_NEGATIVE);
            // set custom stuff for your negative button
        }
    });

这不是最优雅的解决方案,但到目前为止,我还没有找到任何其他适用于最低API等级8的解决方案。

答案 1 :(得分:0)

你可以使用android-support-v4.jar(你可以从here了解这个库)

将此库添加到libs文件夹中,并将其添加到构建路径

现在,为了创建对话框,

现在转换将您的活动扩展FragmentActivity(它不需要任何东西,它只是活动的子类)

现在你必须在你的活动中创建一个静态,如:

public static class ReportNameFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.enter_report_name);

        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.enter_report_dialog, null);
        final EditText reportName = (EditText) view
                .findViewById(R.id.report_name);
        builder.setView(view)
                // Add action buttons
                .setPositiveButton(R.string.save,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                //Positive Button task

                            }
                        })
                .setNegativeButton(R.string.cancel,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                ReportNameFragment.this.getDialog()
                                        .cancel();
                            }
                        });
        return builder.create();
    }
}

通过编写以下内容从活动的任何位置调用此对话框:

DialogFragment reportNameFragment = new ReportNameFragment();
            reportNameFragment.show(getSupportFragmentManager(),
                    "reportNameTypePicker");

如果您想了解有关对话框的更多信息,可以转到here ...