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

Soh*_*ziz 22 android android-fragments android-alertdialog

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

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

但是,我们有这个简单任务的简单机制吗?任何例子或代码?

小智 75

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

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

例如,您可以这样做:

public interface DialogClickListener {
    public void onYesClick();
    public void onNoClick();
}
Run Code Online (Sandbox Code Playgroud)
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
    }
}
Run Code Online (Sandbox Code Playgroud)
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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!这正是我想要的! (2认同)
  • 不适用于"import android.support.v4.app.ListFragment;" 和dialog.setTargetFragment(this,0); 我的ListFragment得到错误:Fragment中的setTargetFragment(android.app.Fragment,int)无法应用于(com.xyz.xyz.CursorAdapterFragment,int) (2认同)