DialogFragment setCancelable property not working

后端 未结 5 2053
闹比i
闹比i 2020-12-25 09:25

I am working in an android application and am using a DialogFragment to show a dialog and I want to make that DialogFragment not cancelable. I have made the dialog cancelabl

相关标签:
5条回答
  • 2020-12-25 09:40
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        AlertDialog.Builder(activity!!).apply {
            isCancelable = false
            setMessage("Your message")
            // your other adjustments
            return this.create()
        }
     }
    

    worked for me.

    The main thing is to use isCancelable = false over setCancellable(false)
    within override fun onCreateDialog().

    0 讨论(0)
  • 2020-12-25 09:43

    In case you use alert builder (and probably in every case you wrap dialog inside a DialogFragment) to help build your dialog, please don't use getDialog().setCancelable(false) or Dialog.setCancelable(false) because it's not going to work. Use setCancelable(false) as shown in code below as it's mentioned in oficial android documentation:

    public void setCancelable (boolean cancelable)
    

    Added in API level 11 Control whether the shown Dialog is cancelable. Use this instead of directly calling Dialog.setCancelable(boolean), because DialogFragment needs to change its behavior based on this."

    ref:http://developer.android.com/reference/android/app/DialogFragment.html#setCancelable(boolean)

    public class MyDialogFragment extends DialogFragment {
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
    
            LayoutInflater inflater = getActivity().getLayoutInflater();
            View view = inflater.inflate(R.layout.dialog_layout, null, false);
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
                    .setTitle("in case you want use a title").setView(view);
    
            AlertDialog alert = builder.create();
            // alert.setCancelable(false); <-- dont' use that instead use bellow approach
            setCancelable(false); <-  press back button not cancel dialog, this one works fine
            alert.setCanceledOnTouchOutside(false); <- to cancel outside touch
    
            return alert;
    }
    
    0 讨论(0)
  • 2020-12-25 09:45
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
        View view = inflater.inflate(R.layout.dialog_test, container, true);
        getDialog().requestWindowFeature(STYLE_NO_TITLE);
        getDialog().setCancelable(false);
    
        return view;
    }
    

    instead of getDialog().setCancelable(false); you have to use directly setCancelable(false);

    so the updated answer will be like this

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
        View view = inflater.inflate(R.layout.dialog_test, container, true);
        getDialog().requestWindowFeature(STYLE_NO_TITLE);
        setCancelable(false);
    
        return view;
    }
    
    0 讨论(0)
  • 2020-12-25 09:46

    Simple Solution in DialogFragment

    Used

    dialog.setCanceledOnTouchOutside(false)
    
    0 讨论(0)
  • 2020-12-25 09:53

    Use the following Snippet

    void showDialog() {
        DialogFragment newFragment = MyAlertDialogFragment.newInstance(
                R.string..alert_dialog_two_buttons_title);
        newFragment.setCancelable(false);
        newFragment.show(getFragmentManager(), "dialog");
    }
    

    and if you want to disable the out side touch around dialog use the following line of code

    DialogFragment.getDialog().setCanceledOnTouchOutside(true);
    
    0 讨论(0)
提交回复
热议问题