Android 在DialogFragment中禁用正/负按钮

Android 在DialogFragment中禁用正/负按钮,android,android-fragments,android-dialog,android-dialogfragment,Android,Android Fragments,Android Dialog,Android Dialogfragment,我模仿了我认为相当标准的Dialogcode: public class DChooseSeparator extends DialogFragment { // ... @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

我模仿了我认为相当标准的
Dialog
code:

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();
    }
}
在显示它的
片段的
onStart
中:

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()
it

那么…我到底可以/应该在哪里禁用
按钮
?我真的必须将
对话框的整个创建过程移动到
onClick
方法吗


提前感谢您的帮助。

您需要在对话框视图创建后调用此函数,在dialogfragment类的oncreateview函数中,您可以在
FragmentDialog
视图创建后启用或禁用
按钮。因此,您必须在对话框的
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");
    }
}

但是我该把节目放在哪里呢?我在创建
对话框的
片段中找到了它,但是现在如果我想在
onCreateView
中做一些事情,它就不起作用了。保持原样,向我们的MyDialog类setOkEnabled(bool val)添加一个函数,然后将这个标志值存储在某个地方,然后覆盖onCreateView,如果该标志为false,则禁用ok按钮右侧,我已经按照您的建议执行了操作,并添加了该函数,并在
myDialog.show(…)
之后调用了该函数。但是,这也不起作用,因为应用程序在我一调用它就崩溃了。非常感谢您的详细回答,感谢您在示例中花时间解决这个问题!这确实有效(尽管我想我也试过)。我想知道……这是推荐的方法吗,还是您应该直接在
片段中为
对话框创建代码?