我创建了ErrorDialogFragment,其中包含OnDialogClickListener参数。
需要显示ErrorDialogFragment的每个其他片段或活动都会在ErrorDialogFragment中通过公共方法设置OnDialogClickListener。同时,所有这些活动和片段都实现了OnDialogClickListener。
如果用户在显示ErrorDialogFragment时从应用程序退出,则会出现问题,并在一段时间后返回(应用程序从内存中删除)。如果用户单击片段选项,它将强制关闭,因为未设置OnDialogClickListener。
我对activity-listener-fragment模式错了,我该如何解决这个问题(应用程序已经处于测试阶段..大模式更改是不可接受的。
例如:
接口:
public interface OnDialogClickListener {
public void OnPositiveClick(int key, Object... args);
public void OnNegativeClick(int key, Object... args);
}
的活动:
public class Home extends FragmentActivity implements TabListener, ServiceConnection, OnDialogClickListener {
.
.
.
@Override
public void OnPositiveClick(int key, Object... args) {
//some actions
}
@Override
public void OnNegativeClick(int key, Object... args) {
//some actions
}
片段:
public class ErrorDialogFragment extends DialogFragment implements OnClickListener {
OnDialogClickListener OnDialogClickListener = null;
.
.
.
public void setDialogListener(OnDialogClickListener listener)
{
OnDialogClickListener = listener;
}
@Override
public void onClick(DialogInterface dialog, int which) {
if(OnDialogClickListener != null){
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
this.dismiss();
OnDialogClickListener.OnPositiveClick(KEY, args);
break;
default:
this.dismiss();
OnDialogClickListener.OnNegativeClick(KEY, args);
break;
}
}
else
this.dismiss();
}
答案 0 :(得分:7)
您可以更好地在DialogFragment#onAttach(Activity)
回调中设置它,如下所示:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mOnDialogClickListener = (OnDialogClickListener) activity;
} catch(ClassCastException e) {
throw new ClassCastException(activity.toString() + "must implement" + OnDialogClickListener.class.getSimpleName());
}
}
@Override
public void onDetach() {
super.onDetach()
mOnDialogClickListener = null;
}
最后,显然,让你的Activity
工具OnDialogClickListener
答案 1 :(得分:0)
在this.dismiss()
回调后写下OnDialogClickListener()
。
@Override
public void onClick(DialogInterface dialog, int which) {
if(OnDialogClickListener != null){
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
OnDialogClickListener.OnPositiveClick(KEY, args);
this.dismiss();
break;
default:
OnDialogClickListener.OnNegativeClick(KEY, args);
this.dismiss();
break;
}
}
else
this.dismiss();
}
答案 2 :(得分:0)
在您的活动和片段的所有onResume()方法中,实现OnDialogClickListener,您必须确保获取DialogFragment实例并重置其侦听器。
您可以从FragmentManager.findFragmentByXyz()或FragmentManager.getFragments()获取引用 请注意,在兼容性包V13上没有FragmentManager.getFragments()(但是?!谁知道......)。