TextInputLayout onclick中的EditText需要2次点击?! Android的

时间:2017-02-26 14:57:11

标签: android onclicklistener

我只是试图在TextInputLayout中的一个编辑文本上单击一下。它工作,但我需要点击EditText两次,它触发我不明白为什么。这是我的代码:

的xml:

  <android.support.design.widget.TextInputLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp">

        <EditText
            android:id="@+id/start_date"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="Starting Date*: "
            android:inputType="textPersonName" />
    </android.support.design.widget.TextInputLayout>

Listenner:

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

2 个答案:

答案 0 :(得分:28)

将属性 android:focusableInTouchMode 设置为 false

android:focusableInTouchMode="false"

在您的edittext xml代码中。

说明,从文档来看,android:focusableInTouchMode是:

  

布尔值,用于控制视图在触摸时是否可以获得焦点   模式。如果视图适用,则该视图可以在获得焦点时获得焦点   单击,如果单击其他视图,则可以保持焦点   没有将此属性设置为true。

默认情况下EditText true

换句话说:第一次点击会使edittext获得焦点,第二次点击会触发ClickListener。所以你应该禁止重点关注触摸。

答案 1 :(得分:0)

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

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

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

此方法的优点是,即使关闭了DatePicker,视图仍将保持焦点(如果您使用的是TextInputLayout.OutlinedBox样式,则它将保持突出显示)。设置focusableInTouchMode = false时不会发生这种情况。

视图集中后,以后的点击只会触发OnClickListener,因此不会被FocusChangeListener调用performClick()再次调用。 (我使用API​​ 29上的调试器对此进行了检查)