我有一个listFragment,我想在listItemClick上显示DialogFragment(是/否)。我想在listFragment中取回用户选择(是/否)。我已经阅读了有关监听器接口机制的信息,但它与活动< - >片段一起使用。这样做的一种方法是:
但是,我们有这个简单任务的简单机制吗?任何例子或代码?
答案 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家伙制作的,所以你知道它是一个高质量的开源项目。
他们在存储库中有一个示例,向您展示它的易用性。