首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IllegalStateException(“您不能设置对话框的OnCancelListener或OnDismissListener")

IllegalStateException(“您不能设置对话框的OnCancelListener或OnDismissListener")
EN

Stack Overflow用户
提问于 2013-01-25 11:11:18
回答 4查看 10.6K关注 0票数 35

此DialogFragment实现将导致

IllegalStateException(“您不能设置对话框的OnCancelListener或OnDismissListener")

。为什么?解决办法?

代码语言:javascript
运行
复制
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");
    }
}
}

我的活动实现DialogInterface.OnCancelListener如下:

代码语言:javascript
运行
复制
public class MainActivity extends Activity implements OkCancelDialogListener{

static final String TAG ="MainActivity";

@Override
public void onCancel(DialogInterface dialog) {


}
}

Exeception是从builder.create();抛出的。怎么了?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-14 13:46:57

来自Android文档

公共对话框onCreateDialog (Bundle savedInstanceState) 覆盖以生成您自己的自定义对话框容器。这通常用于显示AlertDialog而不是一般的对话框;在这样做时,不需要实现onCreateView(LayoutInflater、ViewGroup、Bundle),因为AlertDialog处理自己的内容。 此方法将在onCreate(Bundle)之后和onCreateView(LayoutInflater,ViewGroup,Bundle)之前调用。默认实现只是实例化并返回Dialog类。 备注: DialogFragment拥有Dialog.setOnCancelListener和Dialog.setOnDismissListener回调。你不能亲自设置它们。 要了解这些事件,请重写onCancel(DialogInterface)和onDismiss(DialogInterface).

因此,基本上,您必须重写onDismiss或OnCancel,而不是“.setOnCancelListener(OnCancelListener)”。

票数 87
EN

Stack Overflow用户

发布于 2015-07-20 14:07:36

你可以试试这个:

代码语言:javascript
运行
复制
@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
}

希望能帮上忙..。

票数 6
EN

Stack Overflow用户

发布于 2013-01-25 11:16:02

您为对话框设置OnCancelListener,而不是为其构建器设置。

代码语言:javascript
运行
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14520597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档