在应用程序还原时在片段中设置侦听器实例

时间:2014-06-14 09:58:15

标签: android android-fragments listener

我创建了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();
}    

3 个答案:

答案 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()(但是?!谁知道......)。