Android TextInputLayout onclick中的EditText需要2次单击?!安卓
我只是尝试在TextInputLayout中的编辑文本上进行onlick侦听。它工作,但我需要点击编辑文本两次,它触发我不明白为什么。这是我的密码: xml:Android TextInputLayout onclick中的EditText需要2次单击?!安卓,android,onclicklistener,Android,Onclicklistener,我只是尝试在TextInputLayout中的编辑文本上进行onlick侦听。它工作,但我需要点击编辑文本两次,它触发我不明白为什么。这是我的密码: xml: 将属性android:focusableInTouchMode设置为false android:focusableInTouchMode="false" 在edittextxml代码中 从文档中可以看出,解释如下: 控制视图在接触时是否可以对焦的布尔值 模式如果某个视图是这样,则该视图可以在以下情况下获得焦点: 单击,如果在该视图上单
将属性
android:focusableInTouchMode
设置为false
android:focusableInTouchMode="false"
在edittext
xml代码中
从文档中可以看出,解释如下: 控制视图在接触时是否可以对焦的布尔值 模式如果某个视图是这样,则该视图可以在以下情况下获得焦点: 单击,如果在该视图上单击其他视图,则可以保持焦点 未将此属性设置为true 默认情况下,
EditText
为true
换句话说:第一次单击将使
edittext
获得焦点,第二次单击将触发ClickListener
。因此,您应该禁用“聚焦于触摸”功能。我找到了一个比其他答案更适合我需要的替代解决方案。基本上,您将onClickListener设置为正常,但添加了一个OnFocusChangedListener来拾取第一个点击(当获得焦点时)。这仅在触摸模式下激活,因此不会影响键盘导航
您不需要设置任何与焦点相关的XML属性,只需使用以下代码(kotlin btw):
此方法的优点是,即使在取消日期选择器后,视图仍将保持焦点(如果使用TextInputLayout.OutlinedBox
样式,则视图将保持高亮显示)。当您设置focusableInTouchMode=false时,不会发生这种情况
一旦视图被聚焦,以后的点击将只触发OnClickListener,因此调用performClick()
的FocusChangeListener
不会再次调用它。(我用API 29的调试器检查了)@ Remii不受欢迎,请考虑接受它作为回答您的问题的其他人的答案。如果您长时间点击输入,您将能够粘贴上次复制的文本,所以这不是一个完整的解决方案。@ NabilSouk的情况不是OP问题的一部分。如果您有单独的问题,请随时搜索SO
,如果您没有找到您的目标,请发布新问题。@NabilSouk要获得默认行为,您需要在onClickListener中添加此选项:startDate.setFocusableInTouchMode(true);startDate.requestFocus();考虑使用<代码>片段<代码> > <代码>对话框>代码>,因为很容易泄漏<代码>对话框<代码>。例如,如果显示对话框的用户点击菜单按钮(隐藏应用程序),则系统会破坏活动,然后用户再次启动应用程序,这会导致“活动已泄漏”窗口错误。
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="false"
editText.setOnFocusChangeListener { view, isFocused ->
if (view.isInTouchMode && isFocused) {
view.performClick() // picks up first tap
}
}
editText.setOnClickListener {
showDatePicker() // the actual thing you want to do
}