我有一个对话框A,用于许多活动。我创建了新的对话框B,并实现了一个接口来接收来自A的调用。在这两种情况下我使用了对话框片段。对于许多活动,我可以使用
管理来自A的回调if (getActivity() instanceof MyActivity)
((MyActivity) getActivity()).manageSelectedItem();
但是如果对话框A托管在另一个对话框B中,那么如何管理回调。
我在this上搜索并找到了基于Activity / FragmentActivity / Fragment的解决方案,但无法解决DialogFragment上的问题。
答案 0 :(得分:1)
我建议您查看Bus或使用BroadcastReceiver
来执行此操作,多次回调可以让您的代码耦合,这对于维护而言非常糟糕。
答案 1 :(得分:1)
你可以找到答案heare。或者你可以锁定片段beerwin活动。
getSuportFragmentManager().findFragmentByTag(TAG_FRAGMENT_A).callback();
答案 2 :(得分:1)
我已经解决了这个问题。我刚刚在对话框B中实现了一个界面。在对话框A中的onCreate方法中检查和初始化界面是否托管对话框是活动/对话框。
这是代码
Dialog DialogTwo为A:
public class DialogTwo extends DialogFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
if(!(getActivity() instanceof SelectedItemListener)) {
callback = (SelectedItemListener) getTargetFragment();
}
} catch (Exception e) {
throw new ClassCastException("Calling Fragment must implement SelectedItemListener");
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(getActivity(), R.style.AlertDialogCustom));
builder.setTitle(R.string.select_color)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
if (getActivity() instanceof SelectedItemListener) {
((NewExerciseActivity) getActivity()).manageSelectedItem();
}else {
callback.manageSelectedItem();
}
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
return builder.create();
}
}
来自对话B的电话:
private void showDialog() {
FragmentActivity activity = (FragmentActivity) getActivity();
FragmentManager fm = activity.getSupportFragmentManager();
DialogTwo dialogTwo = new DialogTwo();
dialogTwo.setTargetFragment(this,0);
dialogTwo.show(fm, "dialogTwo");
}
@Override
public void manageSelectedItem() {
//do something
}