我只是试图在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();
}
});
}
答案 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上的调试器对此进行了检查)