У меня есть 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);
}
}
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();
}
}
Буду очень признателен, если кто-нибудь сможет помочь мне указать на проблему или дать мне несколько подсказок.