功能折腾完了记录一下。带删除按钮的AutoCompleteTextView,普通的自动提示控件用起来比较简单,准备好数组给控件setAdapter一下行了,这里要说的是提取sqlite中的数据绑定并且加上清空按钮,先来张图片。
最初没有用过AutoCompleteTextView的时候,就直接百度了下,想必都会得到这样一段代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public
class
MainActivity
extends
Activity
{
private
AutoCompleteTextView
autotext
;
private
ArrayAdapter
<String>
arrayAdapter
;
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
)
;
setContentView
(
R
.
layout
.
test
)
;
autotext
=
(
AutoCompleteTextView
)
findViewById
(
R
.
id
.
autotext
)
;
String
[
]
arr
=
{
"aa"
,
"aab"
,
"aac"
}
;
arrayAdapter
=
new
ArrayAdapter
<String>
(
this
,
android
.
R
.
layout
.
simple_list_item_1
,
arr
)
;
autotext
.
setAdapter
(
arrayAdapter
)
;
}
}
上面的代码简单,但是不大实用,比如我的需求就是,要有清空按钮。然后继续百度,又找到了这篇文章(继承AutoCompleteTextView自定义控件ClearableAutoCompleteTextView,自定义adapter方式实现)
<
span
style
=
"font-style: italic; color: #629755;"
>
https
:
//gist.github.com/mderazon/6700044</span>
然后就闭着眼抄了一下,修改一点,满足了需求。其实碰上问题就百度这种方式是很不对的,所有的控件使用方法在Android Develop Docs中都有介绍:/sdk/docs/reference/android/widget/AutoCompleteTextView.html。哎,我们都是应用程序猿,但我们又连API都不看。。。或许你觉得密密麻麻的英文看着头疼?或许你又翻不了墙?或许吧,还是那句老话,成功的人找方法,而失败的人嘛,对吧。
今天想给AutoCompleteTextView加个图标,就是上图左侧那个放大镜按钮,于是找好素材,设置drawableLeft,运行,发现没有效果。于是查看自定义控件的源码(就是上面使用自定义adapter的那个链接里提到的),发现是在init方法中绑定了setOnTouchListener, 然后onTouchListener中又通过MotionEvent判断触摸的区域,而触摸的对象使用的是setCompoundDrawablesWithIntrinsicBounds,这不就是drawableLeft、drawableRight所对应的方法嘛,果断删除自定义控件ClearableAutoCompleteTextView,使用原生AutoCompleteTextView,加入drawableLeft放大镜按钮,drawableRight使用删除小图标,然后对控件setOnTouchListener,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
actvCityLetter
.
setOnTouchListener
(
new
View
.
OnTouchListener
(
)
{
@Override
public
boolean
onTouch
(
View
v
,
MotionEvent
event
)
{
if
(
actvCityLetter
.
getCompoundDrawables
(
)
[
2
]
==
null
)
return
false
;
if
(
event
.
getAction
(
)
!=
MotionEvent
.
ACTION_UP
)
return
false
;
//触摸点位置判断
if
(
event
.
getX
(
)
>
actvCityLetter
.
getWidth
(
)
-
actvCityLetter
.
getPaddingRight
(
)
-
getResources
(
)
.
getDimension
(
R
.
dimen
.
space_4_touch
)
)
{
actvCityLetter
.
setText
(
""
)
;
}
return
false
;
}
}
)
;
一下子就腰不疼腿不酸了。注意“触摸点位置判断”那行,意思是当前触摸点如果大于AutoCompleteTextView的宽度减去paddingRight的值再剪掉一个固定值(R.dimen.space_4_touch,我这里是10dip),就算触摸到了删除小图标;固定值是多少根据情况来,值越大可以触摸的空间越大,相反越小,用户可能就点击不到那块区域(删除小图标的区域)从而激发不了事件,这也算是优化用户体验的一种手段吧。