TextInputEditText 中的 OnClickListener 包裹在 TextInputLayout 中

OnClickListener in TextInputEditText wrapped around TextInputLayout

我有一个 TextInputEditText 环绕着一个 TextInputLayout,正如 Google 建议的那样:https://developer.android.com/reference/android/support/design/widget/TextInputLayout.html

但是,我的 TextInputEditText 上设置了 OnClickListener,因此当用户点击它时,会弹出 DatePickerDialog。
我的问题是,事实上,在第一次点击时,除了提示标签移动到 TextInputEditText 上方之外,什么也没有发生。 第二次点击时,将显示 DatePickerDialog。

如何让 DatePickerDialog 在第一次点击时显示?
在 TextInutLayout 而不是 TextInputEditText 上设置 onClickListener 不起作用。 有人有想法吗?

日历只在第二次点击时打开是因为您使用的是 edittext。第一次点击时,您的编辑文本将获得焦点。然后第二次点击只调用onClickListener。

如果您不希望手动编辑日期设置(使用键盘),那么为什么不使用 TextView 来显示所选日期呢?

首次单击时显示日历:

如果您需要使用 EditText 并在第一次点击时加载日历,请尝试将 onFocusChangeListner 设置为 editText 而不是 onClickListner

editText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus) {
           // Show your calender here 
        } else {
           // Hide your calender here
        }
    }
});

将属性 android:focusableInTouchMode 设置为 false,如下所示:

android:focusableInTouchMode="false"

在您的 edittext xml 代码中。 如需更多信息,请访问

我用一个改进的解决方案回答了链接的问题,该解决方案不影响键盘导航,但仍然允许您获得所需的焦点行为。

参见,但关键是不要设置任何与焦点相关的XML属性,并在代码中这样做:

editText.setOnFocusChangeListener { view, isFocused ->
    if (view.isInTouchMode && isFocused) {
        view.performClick()  // picks up first tap
    }
}
editText.setOnClickListener {
    showDatePicker() // the actual thing you want to do
}