如何避免在 EditText 失去焦点时启动 dialogfragment?

How do I avoid launching dialogfragment when EditText loses focus?

我在 EditText 行上有一个 OnFocusChangeListener,它启动一个 dialogfragment 以允许用户 select 来自 Datepicker 的日期。 当我在 DialogFragment 上单击 "Set" 时,在 EditText 中设置了 selected 日期。焦点在 EditText 行上,光标在设置日期的开始处闪烁。

只要我在 UI 屏幕上单击另一行 EditText,DialogFragment 就会再次启动,这是我不希望的。基本上,我想在 EditText 最初获得焦点时启动 DialogFragment,在设置日期后,我希望 OnFocusChangeListener 在用户移动光标并将焦点移至屏幕上的另一 EditText 行时 EditText 失去焦点时忽略。请指教

这是 Activity.java 文件中的部分代码:

    ...
    fListenerEditText = (ListenerEditText) findViewById(R.id.FEditText);

    fListenerEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        public void onFocusChange(View v, boolean hasFocus) {
            DialogFragment newFragment = new DatePickerFragment();
            newFragment.show(getSupportFragmentManager(), "datePicker");
        }
    });

这是 DatePickerFragment.java 文件中的部分代码:

    ...
    // Puts the selected date into the EditText line.
    public void onDateSet(DatePicker view, int year, int month, int day) {
    txtDate = (EditText) getActivity().getWindow().getDecorView().getRootView().findViewById(R.id.FEditText);
    String date=(month+1) + "/" + day + "/" + year;
    txtDate.setText(date);
    }

    // When the dialog date is set the dialogfragment closes and the softkeboard re-loads back on the CardViewActivity.
    public void onDismiss(final DialogInterface dialog) {
    super.onDismiss(dialog);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(CardViewActivity.INPUT_METHOD_SERVICE);
    // The soft keyboard always closes when the DialogFragment is displayed.  So the
    // line below toggles the soft keyboard to show again.
    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    }
  }

我相信你忘记了检查"if editText having focus or not"。按如下操作

  fListenerEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
      if(hasFocus){
        DialogFragment newFragment = new DatePickerFragment();
        newFragment.show(getSupportFragmentManager(), "datePicker");
       }
      else {
         // do nothing
       }
    }
});

它只会在 editText 获得焦点时启动你的 DialogFragment,并且不会做任何失去焦点的事情。