IllegalStateException( “You can not set Dialog's OnCancelListener or OnDismissListener”)

浪子不回头ぞ 提交于 2019-11-27 17:07:32

问题


This DialogFragment implementation causes an

IllegalStateException( "You can not set Dialog's OnCancelListener or OnDismissListener")

. Why? Solution?

public class OkCThreadDialog1 extends DialogFragment{

DialogInterface.OnCancelListener onCancelListener;

public OkCThreadDialog1(){
}

public static OkCThreadDialog1 newInstance(String title, String message) {
    OkCThreadDialog1 frag = new OkCThreadDialog1();
    Bundle args = new Bundle();
    args.putString("title", title);
    args.putString("message", message);
    frag.setArguments(args);
    return frag;
}


public Dialog onCreateDialog(Bundle savedInstanceState){

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());


    builder .setTitle(getArguments().getString("title"))
            .setMessage(getArguments().getString("message"))
            .setOnCancelListener(onCancelListener)
            .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }})
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    getDialog().cancel();
                }});

    return builder.create();
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // Verify that the host activity implements the callback interface
    try {
        onCancelListener = (DialogInterface.OnCancelListener) activity;
    } catch (ClassCastException e) {
        // The activity doesn't implement the interface, throw exception
        throw new ClassCastException(activity.toString()
                + " must implement OkCancelDialogListener");
    }
}
}

My Activity implements DialogInterface.OnCancelListener as follow:

public class MainActivity extends Activity implements OkCancelDialogListener{

static final String TAG ="MainActivity";

@Override
public void onCancel(DialogInterface dialog) {


}
}

Exeception is thrown from builder.create();. What's wrong?


回答1:


From Android documentation:

public Dialog onCreateDialog (Bundle savedInstanceState)

Override to build your own custom Dialog container. This is typically used to show an AlertDialog instead of a generic Dialog; when doing so, onCreateView(LayoutInflater, ViewGroup, Bundle) does not need to be implemented since the AlertDialog takes care of its own content.

This method will be called after onCreate(Bundle) and before onCreateView(LayoutInflater, ViewGroup, Bundle). The default implementation simply instantiates and returns a Dialog class.

Note: DialogFragment own the Dialog.setOnCancelListener and Dialog.setOnDismissListener callbacks. You must not set them yourself.

To find out about these events, override onCancel(DialogInterface) and onDismiss(DialogInterface).

So basically, you must override the onDismiss or OnCancel instead of '.setOnCancelListener(onCancelListener)'.




回答2:


You may try this:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Title");
    builder.setMessage("Message");
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // do something positive
        }
    });
    return builder.create();
}

@Override
public void onCancel(DialogInterface dialog) {
    // do something
}

Hope it can help ...




回答3:


You set the OnCancelListener for a dialog not for its builder.

public Dialog onCreateDialog(Bundle savedInstanceState){

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder .setTitle(getArguments().getString("title"))
        .setMessage(getArguments().getString("message"))
        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }})
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                getDialog().cancel();
            }});

    Dialog dialog = builder.create();
    dialog.setOnCancelListener(onCancelListener);
    return dialog;
}



回答4:


Try this code i hope this will be work..

AlertDialog.Builder builder = new AlertDialog.Builder(
            class_name.this);
    builder.setTitle("Title");      
    AlertDialog dialog = builder.create();
    dialog.setButton("ok", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {            

    });


    dialog.setButton2("Cancel", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {


            dialog.cancel();

        }
    });
    dialog.show();


来源:https://stackoverflow.com/questions/14520597/illegalstateexception-you-can-not-set-dialogs-oncancellistener-or-ondismissli

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!