EditText 点击事件小问题
怎么回事
最近在工作的时候遇到一个小小的磕绊,给EditText添加点击事件的时候,需要对控件点击两次,才能触发自定义的 OnClickListener,这是怎么回事?
找了下谷娘才知道,EditText第一次点击的时候,会先获得屏幕的焦点,将首次TouchEvent消费掉,并不会触发自定义的 onClick 监听。
这样的话最简单直接的办法就是,再为 EditText 加一个 onFocusChangeListener ,当获取到焦点的时候,执行自定义的逻辑。另外,如果加了FocusChange就删掉OnClick的监听的话,在具有焦点的情况下继续点击将不会执行自定义逻辑。
后来看到一些说法,实际上为EditText添加OnClick监听是挺不科学的,原因是EditText作为一个输入控件,用户使用控件的过程中有可能因为输入错误等原因,对控件进行点击交互。那么在编写这段代码的时候,有可能就需要加入许多对用户行为的判断以及过滤,这样写出来的代码并不良好,也容易出错。
办法
也许在UI上面,只是需要一个看起来像 EditText 的控件,并不需要EditText内置的交互逻辑。这种情况其实可以用一个TextView将其样式修改成EditText的样子,以及这时候如果需要自定义逻辑,只要一个点击监听就可以了。
<TextView style="@android:style/Widget.EditText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我看起来像个EditText!" />
也可以自定义背景以及文本样式——
<TextView android:background="@drawable/abc_edit_text_material" android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我看起来像个EditText!" />