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

时间:2015-08-07 03:23:38

标签: android android-edittext focus android-dialogfragment

我在EditText行上有一个OnFocusChangeListener,它启动一个dialogfragment以允许用户从Datepicker中选择一个日期。 当我单击DialogFragment上的“Set”时,所选日期在EditText中设置。焦点位于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);
    }
  }

1 个答案:

答案 0 :(得分:1)

我相信你忘了检查“如果editText有焦点”。请执行以下操作

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

仅当DialogFragment获得焦点时才会启动您的editText,并且不会失去任何焦点。