TextInputlayout OnClick内部的EDITTEXT需要2点单击?!安卓



我只是尝试在textInputlayout中对编辑文本进行on link list。它有效,但我需要两次单击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>

听者:

   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 to false

android:focusableInTouchMode="false"

在您的edittext XML代码中。


说明,如文档, android:focusableInTouchMode是:

布尔值控制着一个视图是否可以在接触时焦点 模式。如果这是正确的,则该视图可以在 单击,如果单击另一个视图,可以保持焦点 没有此属性设置为true。

EditText true 默认情况下。

换句话说:第一键单击将使edittext获得焦点,第二次点击是触发ClickListener的焦点。因此,您应该禁用专注于触摸的关注。

我找到了一种替代解决方案,它比其他答案更适合我的需求。基本上,您将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上的调试器检查了一下)

最新更新