我知道有一个问题具有相同的标题,但我的情况有点复杂。在FragmentA中,一旦单击该按钮将启动一个新活动以显示FragmentB,如果然后单击FragmentB中的一个按钮,我需要关闭FragmentB并返回FragmentA并显示DialogFragmentC。我所做的是在FragmentB中定义一个监听器并在FragmentA中实现它。
示例代码段如下:
class FragmentA extends Fragment implements FragmentBDelegate {
.......
@Override
public void onButtonClicked() {
DialogFragment popup = new DialogFragmentC();
popup.show(((AppCompatActivity)getContext()).getSupportFragmentManager(), null);
}
......
}
class FragmentB extends Fragment{
......
private void onButtonClicked(View v) {
getActivity().finish();// to dismiss current activity
if(mListener != null) {
mListener.onButtonClicked();
}
}
public interface FragmentBDelegate {
void onButtonClicked();
}
......
}
为什么DialogFragment没有出现?如果监听器无法实现此要求,如何实现?
答案 0 :(得分:1)
@ ADM的评论指导我一个解决方法。我使用showWithStateLoss()
定义了一个commitAllowingStateLoss()
方法,以便在DialogFragmentC
中提交FragmentTransaction。然后就行了。
public void showWithStateLoss(FragmentManager manager, String tag) {
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commitAllowingStateLoss(); //original it's commit()
}
答案 1 :(得分:0)
你不应该(也许你可以,但不应该)在不同的活动之间使用回调方法。
如果这正是您需要做的,您需要为startActivityForResult()
的结果启动第二个活动。然后决定是否要根据第二个活动结果显示对话框。 FragmentB
将设置结果,而不是尝试调用第一个活动的回调。