【问题标题】:Disable positive/negative button in DialogFragment禁用 DialogFragment 中的正/负按钮
【发布时间】:2014-01-31 15:59:52
【问题描述】:

我模仿了我认为相当标准的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();
    }
}

onStart 中显示它的Fragment

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
    }
}

但是,这不起作用,因为getButton 功能不适用于我的DialogFragment。我也不能在DialogFragment 类中执行此操作,因为我需要先show()

那么...我究竟可以/应该在哪里禁用Button?我真的必须将Dialog 的整个创建移到onClick 方法吗?

提前感谢您的帮助。

【问题讨论】:

    标签: android android-fragments android-dialog android-dialogfragment


    【解决方案1】:

    您可以在创建FragmentDialog 的视图后启用或禁用Button。所以你必须在 Dialog 的 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");
        }
    }
    

    【讨论】:

    • 非常感谢您提供详细的回答并花时间在示例中进行工作!这确实有效(尽管我认为我也尝试过)。我想知道...这是推荐的方法还是您应该直接在Fragment 中创建Dialog 的代码?
    【解决方案2】:

    你需要在对话框的视图被创建后,在 dialogfragment 类的 oncreateview 函数中调用它

    【讨论】:

    • 那么我应该把 show() 放在哪里呢?我在创建DialogFragment 中拥有它,但现在如果我想在onCreateView 中做事,这将不再起作用。
    • 保持原样,向你的 MyDialog 类 setOkEnabled(bool val) 添加一个函数,然后将此标志值存储在某处,然后覆盖 oncreateview,如果标志为 false,则禁用 ok 按钮
    • 好吧,我已经按照你的建议做了,添加了那个函数,并在myDialog.show(...)之后调用了它。但是,这也不起作用,因为应用程序在我调用它时立即崩溃。
    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多