我有一个Activity
和ViewPager
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...
}
}
}