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

Android 如何从对话框片段中获取主机片段中的按钮单击,android,android-fragments,android-alertdialog,Android,Android Fragments,Android Alertdialog,我有一个listFragment,我想在listItemClick上显示一个DialogFragment(是/否)。我想返回listFragment中的用户选择(是/否)。我已经读过关于监听器接口机制的文章,但是它可以与activityfragment一起工作。一种方法是: 在包含“是/否”按钮选择函数的对话框片段中定义接口,并在警报对话框中单击“正/负”按钮时调用这些方法 在主活动中实现此接口 在listFragment中启动dialogFragment单击 在“活动”中保存用户选择 通过在主

我有一个listFragment,我想在listItemClick上显示一个DialogFragment(是/否)。我想返回listFragment中的用户选择(是/否)。我已经读过关于监听器接口机制的文章,但是它可以与activityfragment一起工作。一种方法是:

  • 在包含“是/否”按钮选择函数的对话框片段中定义接口,并在警报对话框中单击“正/负”按钮时调用这些方法
  • 在主活动中实现此接口
  • 在listFragment中启动dialogFragment单击
  • 在“活动”中保存用户选择
  • 通过在主活动中实现的另一个接口在listFragment中获取此选项

  • 但是我们有什么简单的机制来完成这个简单的任务吗?任何示例或代码?

    您也可以使用事件总线来促进组件之间的通信。Otto是一个很好的库,可以在这里使用-->。它是由Square的家伙制作的,所以你知道它是一个高质量的开源项目


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

    还有另一种方法可以从DialogFragment返回结果。您可以使用。创建DialogFragment的实例时,将目标片段设置为它。然后在DialogFragment中,您可以从中获取此片段。例如,您可以这样做:

    public interface DialogClickListener {
        public void onYesClick();
        public void onNoClick();
    }
    

    非常感谢你!这正是我要找的!不适用于“import android.support.v4.app.ListFragment;”和dialog.setTargetFragment(此,0);My ListFragment Get me错误:片段中的setTargetFragment(android.app.Fragment,int)无法应用于(com.xyz.xyz.cursoradapterframent,int)@powder366有任何解决方案吗?谢谢J-rottt帮了我大忙!我发现到处都有对话片段交流的活动!您的回答帮助我创建了从子片段到对话片段的回调!哇,这本应该被更清楚地记录下来,我总是在活动中可怕地传递回调。从链接中可以看出:“这个项目不赞成和[RxAndroid]()。这些项目允许使用与Otto相同的事件驱动编程模型,但它们更具能力,并且提供更好的线程控制。”对于像我这样寻找这些东西的人:
    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();
        }
    }