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

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

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

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

还有另一种方法可以从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(); } } 

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

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