解决Android中输入框点击第二次才触发点击效果

最近在优化项目时,发现项目的一个功能,在popupwindow中有个输入框,每次都需要点击两次才能触发相关的事件

在setOnClickListener调试操作之后,我发现了。EditText这个控件需要在第一次点击的时候获取焦点,第二次点击才触发OnClick事件。非常合理,因为EditText的作用是为了输入文字,所以需要先获取焦点。

查了下资料可以用onTouchListener解决问题,但是就会遇到一个不优雅的情况

提示我可能会和点击事件冲突,要嘛使用@SuppressLint("ClickableViewAccessibility")去抑制,要嘛继承输入框写个类,重写onTouchEvent和performClick,不管用哪种好像都不是很优雅,哈哈

然后找啊找,又发现一个属性

android:focusableInTouchMode="false"

添加这个属性之后就可以像其他空间一样正常调用点击事件,同时根据逻辑在手动设置焦点即可

好奇这个属性的,然后我还查到了很有意思的小故事

从Android的起源开始,因为是移动端的平台,不像PC端,所有的IO就是键盘和鼠标。在Android第一个量产机G1上面,就同时存在了三种点击途径,轨迹球,实体按键和用户手指点击。

那么就会存在这样一个问题:如果我用手指点击了一个List列表中的某一个项目,接着我使用轨迹球选择另外一个,这样就会有冲突。为了解决这个问题,Google引入了TouchModel。

在用户点击屏幕的时候,系统会切换到TouchModel上面,同时保存轨迹球,实体按键选择的item的位置。当用户再次使用键盘操作的时候,系统会退出TouchModel,并将上一次记录的位置展现并定位下来。同时,在移动平台的情况下,用户通过手指点击控件,其实是少了一个选中的步骤的。

举个例子,想一想PC机在没有鼠标点击操作的情况下面,我们需要通过Tab和上下左右去选中一个控件,然后点击Enter去触发这个控件的事件。想一想,如果在Android上面,需要用户先点击控件,获取焦点之后,在进行相应的Action,是非常不合理的。因此,在Android上面,你点击Button的时候,默认其实人眼已经做了焦点的聚焦,真正需要做的就是执行点击事件的内容。但是仍然是需要有例外的,例如EditText,用户点击到EditText首先是需要获取到焦点,完了之后才能弹出键盘,然后让用户输入文字。在这样的情况下面,Android给View的focusableInTouchMode属性就立功了。



请使用浏览器的分享功能分享到微信等