无法在非常快速地单击按钮后关闭对话框片段(Android)



我有一个DialogFragment,上面有一个简单的cancel按钮。我想做的是每次按下取消按钮后都关闭对话框。然而,我发现,如果我在对话框打开后很快点击按钮,dismiss()方法似乎不起作用,对话框将像。。。永远

我的代码(细节简化(:

  • 1.扩展DialogFragment的自定义对话框片段
public class MyDialogFragment extends DialogFragment {
private Callback callback;
// An interface for implementing functions triggered by onClick event.
public interface Callback{
void onCancelClick();
}
// onClick event injection using butterKnife
@OnClick(R.id.button_cancel)
void onClick(View view) {
callback.onCancelClick();
}
// create a new instance
public static MyDialogFragment newInstance() {
MyDialogFragment fragment = new MyDialogFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
/**
Lifecycle begins 
*/
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof Callback) {
callback = (Callback) context;
}
}

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
return dialog;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_dialog_fragment, container, false);
ButterKnife.bind(this, view);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Dialog dialog = getDialog();
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
}
}
    1. 主机活动
public class MyActivity extends AppCompatActivity implements 
MyDialogFragment.Callback {
private MyDialogFragment myDialogFragment;
private boolean isTaskRunnable = false;
/**
*  Call some API
*/
private void callMyApi() {
// Create and show the dialog represents data loading.
myDialogFragment = MyDialogFragment.newInstance();
myDialogFragment.show(getSupportFragmentManager(), "myDialogFragment");
TaskRunnable taskRunnable = new TaskRunnable<XXXXXX>() {
@Override
public responseList doLongOperation(params) throws MyException {
isTaskRunnable = true;
//...... asynchronous execution
return //....
}
@Override
public void callback(responseList response) {
super.callback(response);
if (isTaskRunnable) {
isTaskRunnable = false;
// dismiss the dialog (worked)
if (myDialogFragment != null) {
myDialogFragment.dismiss();
}
}
@Override
public void onFailure(AsyncStatus.ErrorReason reason, String msg) {
super.onFailure(reason, msg);
if (isTaskRunnable) {
isTaskRunnable = false;
// dismiss the dialog (worked)
if (myDialogFragment != null) {
myDialogFragment.dismiss();
}
}
}
};
taskRunnable.setParams(params);
AsyncManager.runBackgroundTask(taskRunnable);
}

/**
* Dismiss() sometimes doesn't work
* when I press the button immediately after openning the dialog.
*/
@Override
public void onCancelClick() {
isTaskRunnable = false;
AsyncManager.cancelAllTasks();
myDialogFragment.dismiss();
}
}

如果有人能帮我指出问题或给我一些线索,我将不胜感激。

我知道这不是解决方案,而是非常便宜的解决方案,但当我遇到这样与时间相关的问题时,我只是把导致问题的代码放在Handler((内部。postDelayed(problemedFunc,500(就像一样

没有回答你的问题,但发现了一些奇怪的东西。

myDialogFragment = myDialogFragment.newInstance();应该是myDialogFragment = MyDialogFragment.newInstance();吗?

最新更新