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

Rém*_*émi 19 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>
Run Code Online (Sandbox Code Playgroud)

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();
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

Ate*_*res 36

将属性设置android:focusableInTouchModefalse,如下所示:

android:focusableInTouchMode="false"
Run Code Online (Sandbox Code Playgroud)

在你的edittextxml代码中.


来自docs的解释android:focusableInTouchMode是:

布尔值,用于控制视图在触摸模式下是否可以获得焦点.如果对于视图是这样,则该视图在单击时可以获得焦点,并且如果单击另一个没有将此属性设置为true的视图,则可以保持焦点.

而且默认情况下EditText真的.


mac*_*our 6

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

你不需要设置任何与焦点相关的 XML 属性,只需使用以下代码(顺便说一句,它是 kotlin):

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

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

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