【发布时间】:2020-03-28 10:39:12
【问题描述】:
我有一个DialogFragment,上面有一个简单的cancel 按钮。
我想要做的是每次按下取消按钮后都关闭对话框。
但是,我发现如果我在对话框打开后很快单击按钮,
dismiss() 方法似乎不起作用,对话框将像...永远一样卡在那里..
我的代码(细节简化):
- 1.扩展
DialogFragment的自定义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);
}
}
- 宿主活动。
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();
}
}
如果有人能帮我指出问题或给我一些线索,我将不胜感激。
【问题讨论】:
标签: java android android-dialogfragment