3

我的每个页面都有一个Activitywith ,并且在每个实现一个(使用)从页面加载数据,但是当请求以错误结束时,键入超时或丢失连接,我需要显示一个对话框重做对服务器的调用的选项,防止为每个错误打开多个对话框的问题通过以下代码段解决:ViewPager PagerSlidingTabStripViewPagerfragmentfragmenthttp requestVolley

在此处查看此解决方案:http: //www.jorgecoca.com/android-quick-tip-avoid-opening-multiple-dialogs-when-tapping-an-element/

@Override
public void show(FragmentManager manager, String tag) {
    if (manager.findFragmentByTag(tag) == null) {
      super.show(manager, tag);
    }
}

当用户单击dialog button重试时,对话框关闭并检查是否有互联网连接,如果我没有,对话框应该再次打开,但对话框不再显示,我相信标签确实没有被释放到FragmentManager

中的代码Activity

final Button mButton = ( Button ) this.findViewById( R.id.btn_opendialog );

final DialogFragmentHelper mDialog = new DialogFragmentHelper();
mDialog.setCallbackListener( new OnCallback() {

    @Override
    public void onCancel() {

    }

    @Override
    public void onConfirm() {

        // verify if network available

        mDialog.show( MainActivity.this.getSupportFragmentManager(), DialogFragmentHelper.DIALOG_TAG );
    }
} );

mButton.setOnClickListener( new OnClickListener() {

    @Override
    public void onClick( final View v ) {

        mDialog.show( MainActivity.this.getSupportFragmentManager(), DialogFragmentHelper.DIALOG_TAG );
    }
} );

有人会建议解决方法吗?

4

2 回答 2

2

为了维护我的项目中准备好的结构,并保持更接近我的目标,即不使用标志,也不通过控制第三个对话框片段来管理,得出了一个需要一个小时的解决方案结果。

DialogFragmentHelper mDialog = new DialogFragmentHelper();
mDialog.setCallbackListener( new OnCallback() {

    @Override
    public void onCancel() {}

    @Override
    public void onConfirm() {

        mDialog.dismissAllowingStateLoss();

        if(networkAvailable == false){

            new Handler().post( new Runnable() {

                @Override
                public void run() {
                    mDialog.show( MainActivity.this.getSupportFragmentManager(), DialogFragmentHelper.DIALOG_TAG );
                }
            } );

        }else {
            //do something here
        }
    }
} );

这样我保证虽然发送了几个请求来打开对话框片段,但只执行第一个请求,然后关闭对话框片段,如果需要,我可以快速再次打开它,就像我正在工作的场景中那样。

于 2014-07-16T19:24:30.330 回答
1

您可以使用单例控制器来处理它。例如:

package com.example.stackoverflowsandbox;

public class MyDialogController {
    private static MyDialogController instance;

    public static MyDialogController getInstance() {
        if ( MyDialogController.instance == null ) {
            MyDialogController.instance = new MyDialogController();
        }

        return MyDialogController.instance;
    }

    private boolean dialogOpenned;

    private MyDialogController() {}

    public void closeDialog() {
        if ( this.dialogOpenned ) {
            this.dialogOpenned = false;

            // you close code...
        }
    }

    public void openDialog() {
        if ( !this.dialogOpenned ) {
            this.dialogOpenned = true;

            // your open code...
        }
    }
}
于 2014-07-14T21:05:08.247 回答