在DialogFragment中禁用积极/消极按钮

5

我模仿了我认为是相当标准的对话框(Dialog)代码:

public class DChooseSeparator extends DialogFragment
{
    // ...
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();

        builder
            .setTitle("My Title")
            .setView(myDialogLayout)
            .setPositiveButton(getString(R.string.sOKButton), new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    if(myEditText.getText().toString().equals("")) // disable positive button if this is empty
                    {
                        Toast.makeText(getActivity(), "enter something!", Toast.LENGTH_SHORT).show();
                    }
                    else { myListener.onSet(myEditText.getText().toString()); }
                }
            })
            .setNegativeButton(getString(R.string.sCancelButton), new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // do nothing
                }
            });

        return builder.create();
    }
}

并且在显示它的FragmentonStart方法中:

sepButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        MyDialog myDialog = new MyDialog();
        myDialog.show(getFragmentManager(), "tMyDialogTag");
        myDialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(false);   // DOES NOT WORK
    }
}

然而,这并不起作用,因为在我的DialogFragment中无法使用getButton函数。我也不能在DialogFragment类中完成此操作,因为我需要先调用show()。
那么,我应该在哪里禁用Button?我是否真的需要将整个创建对话框的过程移到onClick方法中?
感谢您提前的帮助。
2个回答

7

FragmentDialog 视图创建后,您可以启用或禁用 Button。因此,您需要在对话框的 onStart() 方法中调用它。

请参考我的代码:

public class DChooseSeparator extends DialogFragment
{
    // MEMBER
    private AlertDialog dialog;
    private static boolean mEnableButton;

    // You need an empty constructor: "All subclasses of Fragment must include a public empty constructor. "  
    // like it's described in the Fragment API -> so create a new Insatnce with this static methjod
    public static DChooseSeparator newInstance(boolean enableButton){
        mEnableButton = enableButton;
        return new DChooseSeparator();
    } 
    // ...
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();

        builder
            .setTitle("My Title")
            .setView(myDialogLayout)
            .setPositiveButton(getString(R.string.sOKButton), new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    if(myEditText.getText().toString().equals("")) // disable positive button if this is empty
                    {
                        Toast.makeText(getActivity(), "enter something!", Toast.LENGTH_SHORT).show();
                    }
                    else { myListener.onSet(myEditText.getText().toString()); }
                }
            })
            .setNegativeButton(getString(R.string.sCancelButton), new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // do nothing
                }
            });

        dialog = builder.create()

        return dialog;
    }

    @Override
    public void onStart(){
        super.onStart();
        dialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(mEnableButton);
    }
}

现在你可以这样调用您的对话框:
sepButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        MyDialog myDialog = new MyDialog(false);
        myDialog.show(getFragmentManager(), "tMyDialogTag");
    }
}

1
非常感谢您详细的回答并抽出时间在示例中进行测试! 这确实有效(尽管我认为我也试过这个)。 我想知道...这是推荐的方法吗?还是应该直接在“Fragment”中创建“Dialog”的代码? - Markstar

0

需要在Dialog的视图创建后调用此函数,在DialogFragment类的onCreateView函数中调用。


但是我应该把show()放在哪里呢?我原本将它放在创建Dialog的Fragment中,但是如果我想在onCreateView中进行操作,这种方法就不再适用了。 - Markstar
保持原样,向您的MyDialog类添加一个函数setOkEnabled(bool val),然后在某处存储此标志值,并覆盖oncreateview,如果标志为false,则禁用ok按钮。 - Pulkit Sethi
好的,我已经按照你的建议添加了那个函数,并在 myDialog.show(...) 之后调用了它。然而,这也不起作用,因为一旦我调用它,应用程序就会崩溃。 - Markstar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接