TextInputEditText包装在TextInputLayout中的OnClickListener

13
我有一个TextInputEditText包装在一个TextInputLayout中,这是Google推荐的做法:https://developer.android.com/reference/android/support/design/widget/TextInputLayout.html。 然而,我的TextInputEditText上设置了一个OnClickListener,所以当用户点击它时,会弹出一个DatePickerDialog。 问题是,在第一次点击时除了提示标签移动到TextInputEditText上方外,什么也不会发生。 第二次点击时,DatePickerDialog才会显示出来。 我该如何使DatePickerDialog在第一次点击时就显示出来? 在TextInputLayout上设置OnClickListener而不是TextInputEditText并不能解决问题。有人有想法吗?

你能把你的代码放在这里吗? - AJay
什么代码?这只是一个基本的XML,其中包含一个TextInputLayout包装的TextInputEditText,在Java侧面上设置了一个简单的OnClickListener,它被设置在TextInputEditText上。 - Andy Strife
4个回答

19

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

如果您不想手动编辑日期(使用键盘),为什么不使用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
        }
    }
});

3
谢谢您的回复,伙计。明天我回到工作岗位后会实现它,并在它起作用时标记您的回应。 回答您的问题:为什么不使用TextView来显示所选日期呢?嗯,你知道的,那些UX /设计团队的猴子们... - Andy Strife
@AndyStrife 好的,那么在EditText上设置setOnFocusChangeListener,这将在单击时显示日历。 - Harshad Pansuriya

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

在你的EditText XML代码中。 欲了解更多信息,请访问此处


这样也可以 - 根据你的解决方案,这可能是更好的解决方案。在我的情况下,我创建了一个名为TextInputLayoutWithEditText的自定义视图,它允许我设置点击监听器,然后在将监听器传递给编辑文本之前内部调用getEditText()。setFocusable(false);
  • 这个方法表现出乎意料的好。
- slott

1
一种简单的解决方案是设置如下内容:
android:focusable="false"

使用 TextInputEditTextEditText

并且使用:

edittext.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {

                if (motionEvent.getAction() == MotionEvent.ACTION_UP){
                    showDatePicker();
                    return true;
                }

                return false;
            }
        });

它还可以避免在编辑文本字段中显示光标。

1
我用一个改进的解决方案回答了相关问题,不会影响键盘导航,但仍然可以实现所需的焦点行为。具体请参见https://dev59.com/lFgQ5IYBdhLWcg3wnVV3#62875800,关键是不要设置任何与焦点有关的 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
}

我不确定为什么这个回答被踩了,因为它完美地解决了问题。我的问题和提问者的一样,而这就是我使用的解决方案。我错过了什么吗? - machfour
这解决了一个问题,当(UX体验)用户已经选择了日期时间,然后想通过单击TextInputEditText来选择相反的日期时间。例如:_bindingIs.txtTglBerangkat.setOnFocusChangeListener { view, b -> if (b) pickDateTime(_bindingIs.txtTglBerangkat) } _bindingIs.txtTglBerangkat.setOnClickListener { pickDateTime(_bindingIs.txtTglBerangkat) } - Yogi Arif Widodo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接