I have a listFragment, where I want to display a DialogFragment (Yes/No) on listItemClick. I want to get back the user selection(Yes/No) in listFragment. I have read about the listener interface mechanism but that work with activity<->fragment. One way of doing this can be:
- Define interface in dialog fragment containing yes/no button selection functions, and call these methods on alert dialog positive/negative button clicks.
- Implement this interface in Main activity.
- Initiate dialogFragment in listFragment onItem click.
- Save user selection in activity.
- get this choice in listFragment by another interface, implemented in Main activity.
But do we have any simple mechanism for this simple task? any example or code?
还有另一种方式如何得到的结果从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();
}
}
您还可以使用事件总线,以促进组件之间的通信。 奥托是使用可以在这里找到一个伟大的图书馆- > https://github.com/square/otto 。 它是由方形的家伙,让你知道它的质量开源项目做出。
他们有将告诉您它是多么容易使用的存储库的样本。