我只是尝试在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上的调试器检查了一下)