当前位置: 首页 > 面试题库 >

在DialogFragment中未调用OnCancelListener

慕乐池
2023-03-14
问题内容

我有一个简单的程序AlertDialog,其中显示了一些项目的列表,单击其中的一个后,单击的项目将传递回附件Activity。当用户取消对话框时,我还想执行一些默认处理(使用
后退按钮 )-更具体地说,在这种情况下,我想向活动传递一个空字符串。

但是,如果将对话框放在DialogFragment(来自 兼容性包 )中,OnCancelListener
则使用后退按钮关闭对话框时不会调用 。我究竟做错了什么?

public class SelectItemDialog extends DialogFragment {

    public interface Callback {
        void onItemSelected(String string);
    }

    private static final String ARG_ITEMS = "items";

    private Callback callback;

    public static SelectItemDialog fromItems(Collection<String> items) {
        SelectItemDialog fragment = new SelectItemDialog();
        fragment.setArguments(newArguments(items));
        return fragment;
    }

    private static Bundle newArguments(Collection<String> items) {
        Bundle arguments = new Bundle();
        arguments.putStringArray(ARG_ITEMS, items.toArray(new String[items.size()]));
        return arguments;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        callback = (Callback) activity;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final String[] items = getArguments().getStringArray(ARG_ITEMS);
        return new AlertDialog.Builder(getActivity())
            .setTitle(R.string.dialog_select_email_title)
            .setItems(items, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    callback.onItemSelected(items[which]);
                }
            })
            .setOnCancelListener(new OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    // this code is not executed
                    callback.onItemSelected("");
                    throw new RuntimeException("dialog cancelled");
                }
            })
            .create();
    }
}

问题答案:

这可能与cancel()您的代码中没有显式调用的事实有关。该OnCancelListener文档说:

仅在取消对话框时调用

这可能需要显式cancel()调用。

用a
OnClickListener调用一个正/负按钮,DialogInterface#cancel()或使用a
OnDismissListener()进行额外检查以查看是否单击了列表项。

另外,要监听后退按键并取消对话框,您可以设置一个OnKeyListener,如本SO回答中所述

同样,一旦设置了对话框,最好还是使用一个好方法Dialog#setCanceledOnTouchOutside(),以防用户在对话框外点击。

编辑:以下部分是处理DialogFragment中的取消事件的简单方法。

由于您使用DialogFragment,因此此类具有一个非常方便的方法,DialogFragment#onCancel()DialogFragment取消时会调用该方法。在那做你的逻辑。

DialogFragments更复杂,其生命周期与普通对话框略有不同。因此,如果您有Dialog尝试移植到的基于特定方法的方法,请首先查看文档DialogFragment,其中可能存在一些使新实现正常运行的方法!



 类似资料:
  • 那么DialogFragments有什么特别之处呢?为什么在显示对话框时没有暂停调用片段?又如何实现呢? 我在文档中没有发现任何关于这种行为的引用,所以引用是一个加号。

  • 现在我有:- 1) 1活动,它是从AppCompactActivity扩展而来的主要活动。 2) 1扩展自fragment的类,这是从主活动(1)-ProfileTeacherActivity调用的片段。java 3) 1个从DialogFragment扩展的fragment类,此对话框从fragment(2)-ModalBox调用。java 所以,基本上,这只是一个简单的执行流程。开始时,显示的

  • 从我的中,每个项目中都有多个按钮,我想要的是在单击,并在单击。 问题是我不知道如何才能或如何才能实现一个回调时被点击,并可以执行不同的方法或操作根据什么按钮是点击每个项目。 在我的适配器类上 这是我的DialogFragment类

  • 在我开始之前,我读过类似的文章,但它们对我不起作用。 正如我在标题中解释的那样,当我单击肯定按钮(在这种情况下为“确定”)时,我会得到一个NPE。如果有人能指出我做得不正确,那就太好了!下面是我的设置的抽象版本

  • 我有GCMinentService,以便将GCM消息传递到我的应用程序。在我的其他应用程序项目中,同样的代码也可以正常工作,但在这个新项目中,设备注册正确,我得到了注册,等等。。。在这个类中,我想向当前登录的用户注册de设备令牌,为此,我使用AsyncTask使用Ksoap2调用我的Web服务。 调用到webServices的方法工作正常,但onPostExecute从未被调用,但是doInBac

  • 问题内容: 好吧,我受够了尝试。 该方法不起作用。知道为什么吗? 编辑: 该方法在我调用时执行,但是显然这不是目的,而且我也不会获得所需的参数。 问题答案: 不再存在。您应该使用它来获得所需的功能。我相信示例具有您的特定情况。我在下面对其进行了修改,使其与您的匹配。