【问题标题】:Can't dismiss DialogFragment after clicking the button very quickly (Android)快速单击按钮后无法关闭 DialogFragment (Android)
【发布时间】: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);
    }

}
    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();
    }

        }

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

【问题讨论】:

    标签: java android android-dialogfragment


    【解决方案1】:

    我知道这不是解决方案,而是相当便宜的解决方法,但是当我遇到与时间相关的问题时,我只是将导致问题的代码放入 Handler().postDelayed(problemedFunc, 500) 中

    【讨论】:

    • 谢谢。非常有帮助!我跟踪 onClick 事件,发现我在几毫秒内按了 3 次取消按钮......这导致了问题。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多