Android: 自定义 DialogPreference Ok/Cancel 按钮

Android: customize DialogPreference Ok/Cancel buttons

我找不到正确修改 DialogPreferenceOk/Cancel 按钮的方法。

我的应用程序中的所有输入对话框都有以下按钮框:

这是我在 DialogPreference:

中可以得到的

当然不能接受,因为按钮被调换了,中间有一条可怕的线。

为了将更改应用到按钮,我所做的是获取 Dialog int showDialog 方法并为布局设置背景:

public class RingtonePreference extends DialogPreference
{

    @Override
    protected void showDialog(Bundle state)
    {
        super.showDialog(state);

        Dialog d = getDialog();
        Utils.setAlertDialogButtons(getContext(), (AlertDialog)d, true);
    }

...

static public void setAlertDialogButtons(Context c, final AlertDialog alertDialog, final boolean hasNegative)
{
    try
    {
        int size = (int)c.getResources().getDimension(R.dimen.btn_size);
        TableRow.LayoutParams lp = new TableRow.LayoutParams(size, size);
        lp.setMargins(size/2, 5, size/2, 5);

        Button posBtn = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
        LinearLayout tr = (LinearLayout)posBtn.getParent();
        tr.setGravity(Gravity.CENTER);
        tr.setBackgroundResource(R.drawable.fixed_buttons_background);

        posBtn.setText("");
        posBtn.setLayoutParams(lp);
        posBtn.setBackgroundResource(R.drawable.btn_apply_selector);

        if (hasNegative)
        {
            Button negBtn = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE);
            negBtn.setText("");
            negBtn.setLayoutParams(lp);
            negBtn.setBackgroundResource(R.drawable.btn_back_selector);
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
        Log.e("U", e.getMessage());
    }
}

我要放弃了,但在这样做之前,我在这里寻求帮助。 放弃意味着“保留原来的设置面板”(可怕):

所以,请帮助:)

  1. 确保您的标准应用程序屏幕和首选项屏幕使用相同的主题以获得一致的结果。

  2. 未经测试但应该可以工作:如果您想更改底部按钮栏的外观,您可以做的是:

    • 覆盖 DialogPreference 中的 setPositiveButtonText()setNegativeButtonText() 使它们成为空操作,因此 Android 将不会显示标准 "ok"和 "cancel" 按钮栏。

    • 然后在您重写的 showDialog() 方法中,像现在一样检索 Dialog 后,将其转换为 AlertDialog 并调用 setView() 以传递您的自定义页脚布局。它将显示在列表下方与 OK/Cancel 按钮相同的位置。