如何从对话框片段中获取主机片段中的按钮单击

时间:2012-11-05 19:27:28

标签: android android-fragments android-alertdialog

我有一个listFragment,我想在listItemClick上显示DialogFragment(是/否)。我想在listFragment中取回用户选择(是/否)。我已经阅读了有关监听器接口机制的信息,但它与活动< - >片段一起使用。这样做的一种方法是:

  1. 在包含是/否按钮选择功能的对话框片段中定义界面,并在警告对话框的正/负按钮点击上调用这些方法。
  2. 在主要活动中实施此界面。
  3. 在listFragment onItem点击中启动dialogFragment。
  4. 将用户选择保存在活动中。
  5. 通过另一个界面在listFragment中获取此选项,在主要活动中实现。
  6. 但是,我们有这个简单任务的简单机制吗?任何例子或代码?

2 个答案:

答案 0 :(得分:73)

还有另一种方法可以从DialogFragment中获取结果。

您可以使用Fragment.setTargetFragment()。创建DialogFragment的实例时,将目标片段设置为它。然后在DialogFragment中,您可以从Fragment.getTargetFragment()获取此片段。

例如,您可以这样做:

public interface DialogClickListener {
    public void onYesClick();
    public void onNoClick();
}
public class MyListFragment extends ListFragment implements DialogClickListener {

    ...

    private void showDialog() {
        DialogFragment dialog = new MyDialogFragment();
        dialog.setTargetFragment(this, 0);
        dialog.show(getFragmentManager(), "dialog");
    }

    @Override
    public void onYesClick() {
        // do something
    }

    @Override
    public void onNoClick() {
        // do something
    }
}
public class MyDialogFragment extends DialogFragment {
    private DialogClickListener callback;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            callback = (DialogClickListener) getTargetFragment();
        } catch (ClassCastException e) {
            throw new ClassCastException("Calling fragment must implement DialogClickListener interface");
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("message")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        callback.onYesClick();
                    }
                }).setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        callback.onNoClick();
                    }
                });

        return builder.create();
    }
}

答案 1 :(得分:2)

您还可以使用事件总线来促进组件之间的通信。 Otto是一个很棒的图书馆,可以在这里使用 - > https://github.com/square/otto。它是由Square家伙制作的,所以你知道它是一个高质量的开源项目。

他们在存储库中有一个示例,向您展示它的易用性。