Невозможно закрыть DialogFragment после очень быстрого нажатия кнопки (Android) - PullRequest
0 голосов
/ 28 марта 2020

У меня есть 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();
    }

        }

Буду очень признателен, если кто-нибудь сможет помочь мне указать на проблему или дать мне несколько подсказок.

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Я знаю, что это не решение, а довольно дешевый обходной путь, но когда у меня возникает такая проблема, связанная со временем, я просто помещаю код, вызывающий проблему, в Handler (). PostDelayed (problemmedFun c, 500) вот так

0 голосов
/ 28 марта 2020

Не ответить на ваш вопрос, но нашел что-то странное.

Должно ли myDialogFragment = myDialogFragment.newInstance(); быть myDialogFragment = MyDialogFragment.newInstance();?

...