Android TextInputLayout onclick中的EditText需要2次单击?!安卓

Android TextInputLayout onclick中的EditText需要2次单击?!安卓,android,onclicklistener,Android,Onclicklistener,我只是尝试在TextInputLayout中的编辑文本上进行onlick侦听。它工作,但我需要点击编辑文本两次,它触发我不明白为什么。这是我的密码: xml: 将属性android:focusableInTouchMode设置为false android:focusableInTouchMode="false" 在edittextxml代码中 从文档中可以看出,解释如下: 控制视图在接触时是否可以对焦的布尔值 模式如果某个视图是这样,则该视图可以在以下情况下获得焦点: 单击,如果在该视图上单

我只是尝试在TextInputLayout中的编辑文本上进行onlick侦听。它工作,但我需要点击编辑文本两次,它触发我不明白为什么。这是我的密码:

xml:


将属性
android:focusableInTouchMode
设置为false

android:focusableInTouchMode="false"
edittext
xml代码中


从文档中可以看出,解释如下:

控制视图在接触时是否可以对焦的布尔值 模式如果某个视图是这样,则该视图可以在以下情况下获得焦点: 单击,如果在该视图上单击其他视图,则可以保持焦点 未将此属性设置为true

默认情况下,
EditText
为true


换句话说:第一次单击将使
edittext
获得焦点,第二次单击将触发
ClickListener
。因此,您应该禁用“聚焦于触摸”功能。

我找到了一个比其他答案更适合我需要的替代解决方案。基本上,您将onClickListener设置为正常,但添加了一个OnFocusChangedListener来拾取第一个点击(当获得焦点时)。这仅在触摸模式下激活,因此不会影响键盘导航

您不需要设置任何与焦点相关的XML属性,只需使用以下代码(kotlin btw):

此方法的优点是,即使在取消日期选择器后,视图仍将保持焦点(如果使用
TextInputLayout.OutlinedBox
样式,则视图将保持高亮显示)。当您设置
focusableInTouchMode=false时,不会发生这种情况


一旦视图被聚焦,以后的点击将只触发OnClickListener,因此调用
performClick()
FocusChangeListener
不会再次调用它。(我用API 29的调试器检查了)

@ Remii不受欢迎,请考虑接受它作为回答您的问题的其他人的答案。如果您长时间点击输入,您将能够粘贴上次复制的文本,所以这不是一个完整的解决方案。@ NabilSouk的情况不是OP问题的一部分。如果您有单独的问题,请随时搜索
SO
,如果您没有找到您的目标,请发布新问题。@NabilSouk要获得默认行为,您需要在onClickListener中添加此选项:startDate.setFocusableInTouchMode(true);startDate.requestFocus();考虑使用<代码>片段<代码> > <代码>对话框>代码>,因为很容易泄漏<代码>对话框<代码>。例如,如果显示对话框的用户点击菜单按钮(隐藏应用程序),则系统会破坏活动,然后用户再次启动应用程序,这会导致“活动已泄漏”窗口错误。
   private void setListenners() {
        EditText startDate = (EditText) mView.findViewById(R.id.start_date);
        startDate.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.N)
            @Override
            public void onClick(View v) {
                Calendar mcurrentDate=Calendar.getInstance();
                int mYear = mcurrentDate.get(Calendar.YEAR);
                int mMonth = mcurrentDate.get(Calendar.MONTH);
                int mDay = mcurrentDate.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog mDatePicker=new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                        Log.d("DEBUG", "year: " + year + " month: " + month + " day: " + day);
                    }
                },mYear, mMonth, mDay);
                mDatePicker.show();
            }
        });
    }
android:focusableInTouchMode="false"
    editText.setOnFocusChangeListener { view, isFocused ->
        if (view.isInTouchMode && isFocused) {
            view.performClick()  // picks up first tap
        }
    }
    editText.setOnClickListener {
        showDatePicker() // the actual thing you want to do
    }