22

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

  1. 在对话框片段中定义包含是/否按钮选择功能的接口,并在警报对话框正/负按钮单击时调用这些方法。
  2. 在 Main 活动中实现此接口。
  3. 在listFragment 中启动dialogFragment onItem 点击。
  4. 在活动中保存用户选择。
  5. 通过在 Main 活动中实现的另一个接口在 listFragment 中获取此选择。

但是对于这个简单的任务,我们有什么简单的机制吗?任何示例或代码?

4

2 回答 2

75

还有另一种方法可以从 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();
    }
}
于 2013-01-01T12:23:05.973 回答
2

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

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

于 2012-11-06T06:33:13.667 回答