安卓系统:避免多次打开对话框,但允许隐藏和显示相同的对话框



我有一个ActivityViewPager PagerSlidingTabStrip,我的ViewPager的每个页面都有fragment,在每个fragment中实现http request(使用Volley(从页面加载数据,但当请求以错误、类型超时或连接丢失结束时,我需要显示一个对话框,其中包含重新调用服务器的选项,防止每个错误都打开多个对话框的问题通过以下代码段得到了解决:

请在此处查看此解决方案: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 );
    }
} );

有人能提出一个变通办法吗?

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

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
        }
    }
} );

通过这种方式,我保证在发送了几个打开对话片段的请求时,只执行第一个请求,并关闭对话片段,如果需要,我可以快速再次打开它,就像我正在处理的场景中一样。

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

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...
        }
    }
}

最新更新