AutoCompleteTextView使用——自动完成文本框
2013-10-03 22:12
519 查看
自动完成文本框(AutoCompleteTextView)从EditText继承过来。因此它实质也是一个文本编辑框。但是比起普通的文本编辑框,AutoCompleteTextView多了一个功能:当用户在文本编辑框中输入一定文本之后,AutoCompleteTextView会显示出一个包含用户输入内容的下拉菜单,供用户选择,当用户选择其中的某个菜单项后
,AutoCompleteTextView会将用户选择的菜单项自动填写到该文本框,功能类似于百度或者Google在搜索栏输入信息的时候,弹出的与输入信息接近的提示信息。
在下面的XML界面布局文件中包含一个AutoCompleteTextView组件,界面布局采用了线性布局。在XML布局文件中,基本语法如下:
1)修改布局文件:
2)在主活动onCreat()方法中,实现如下:
在onCreat()方法中,创建一个保存下拉菜单中要显示的列表项的ArrayAdepter适配器,最后将该适配器与自动完成文本框相关联,关键代码如下:
下面出现的是源码内容
需要注意的是,我这里用到的AutoCompleteTextView的几个方法
1. setAdapter()方法:这里要传递的adapter参数必须是继承ListAdapter和Filterable的,其中arrayAdapter和simpleAdapter都能满足要求,我们常用arrayAdapter,因为他不需要像simpleAdapte那样设置他的显示位置和textview组件。
要想掌握它,就必须查看他的源码,我们可以看看arrayadapter是如何实现
凡是继承了Filterable的adapter都必须重写getFilter接口方法
[java] view
plaincopy
public Filter getFilter() {
if (mFilter == null) {
mFilter = new ArrayFilter();
}
return mFilter;
}
这个filter 就是实现过滤方法的对象,同样,我们可以查看他的源码是如何实现的
[java] view
plaincopy
/**
* <p>An array filter constrains the content of the array adapter with
* a prefix. Each item that does not start with the supplied prefix
* is removed from the list.</p>
*/
private class ArrayFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (mOriginalValues == null) {
synchronized (mLock) {
mOriginalValues = new ArrayList<T>(mObjects);
}
}
if (prefix == null || prefix.length() == 0) {
synchronized (mLock) {
ArrayList<T> list = new ArrayList<T>(mOriginalValues);
results.values = list;
results.count = list.size();
}
} else {
String prefixString = prefix.toString().toLowerCase();
final ArrayList<T> values = mOriginalValues;
final int count = values.size();
final ArrayList<T> newValues = new ArrayList<T>(count);
for (int i = 0; i < count; i++) {
final T value = values.get(i);
final String valueText = value.toString().toLowerCase();
// First match against the whole, non-splitted value
if (valueText.startsWith(prefixString)) {
newValues.add(value);
} else {
final String[] words = valueText.split(" ");
final int wordCount = words.length;
for (int k = 0; k < wordCount; k++) {
if (words[k].startsWith(prefixString)) {
newValues.add(value);
break;
}
}
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
这是arrayAdapter自定义的一个私有内部类,所谓私有,就意味着你不能通过继承去修改这种过滤方法,同样你也不能直接得到他过滤后结果集results。假如你想使用新的过滤方法,你必须重写getfilter()方法,返回的filter对象是你要新建的filter对象(在里面包含performFiltering()方法重新构造你要的过滤方法)
2.setDropDownHeight方法 ,用来设置提示下拉框的高度,注意,这只是限制了提示下拉框的高度,提示数据集的个数并没有变化
3.setThreshold方法,设置从输入第几个字符起出现提示
4.setCompletionHint方法,设置提示框最下面显示的文字
5.setOnFocusChangeListener方法,里面包含OnFocusChangeListener监听器,设置焦点改变事件
6.showdropdown方法,让下拉框弹出来
我没有用到的一些方法列举
1.clearListSelection,去除selector样式,只是暂时的去除,当用户再输入时又重新出现
2.dismissDropDown,关闭下拉提示框
3.enoughToFilter,这是一个是否满足过滤条件的方法,sdk建议我们可以重写这个方法
4. getAdapter,得到一个可过滤的列表适配器
5.getDropDownAnchor,得到下拉框的锚计的view的id
6.getDropDownBackground,得到下拉框的背景色
7.setDropDownBackgroundDrawable,设置下拉框的背景色
8.setDropDownBackgroundResource,设置下拉框的背景资源
9.setDropDownVerticalOffset,设置下拉表垂直偏移量,即是list里包含的数据项数目
10.getDropDownVerticalOffset ,得到下拉表垂直偏移量
11..setDropDownHorizontalOffset,设置水平偏移量
12.setDropDownAnimationStyle,设置下拉框的弹出动画
13.getThreshold,得到过滤字符个数
14.setOnItemClickListener,设置下拉框点击事件
15.getListSelection,得到下拉框选中为位置
16.getOnItemClickListener。得到单项点击事件
17.getOnItemSelectedListener得到单项选中事件
18.getAdapter,得到那个设置的适配器
,AutoCompleteTextView会将用户选择的菜单项自动填写到该文本框,功能类似于百度或者Google在搜索栏输入信息的时候,弹出的与输入信息接近的提示信息。
在下面的XML界面布局文件中包含一个AutoCompleteTextView组件,界面布局采用了线性布局。在XML布局文件中,基本语法如下:
<AutoCompleteTextView 属性列表 > </AutoCompleteTextView>
1)修改布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <AutoCompleteTextView android:id="@+id/autoCompleteTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="7" android:text="" android:completionHint="输入搜索内容" android:completionThreshold="2" /> <Button android:id="@+id/searchBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/search" /> </LinearLayout>
2)在主活动onCreat()方法中,实现如下:
public class MainActivity extends Activity { private static final String[] COUNTRIES ={ "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Cote d'Ivoire", "Cambodia", "Cameroon", "Canada", "Cape Verde", "Democratic Republic of the Congo", "Denmark", "Djibouti", "Dominica", "East Timor", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView); ArrayAdapter<String> adapter =new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,COUNTRIES); textView.setAdapter(adapter); Button button = (Button)findViewById(R.id.searchBtn); button.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this,textView.getText().toString(), Toast.LENGTH_LONG).show(); } }); } }
在onCreat()方法中,创建一个保存下拉菜单中要显示的列表项的ArrayAdepter适配器,最后将该适配器与自动完成文本框相关联,关键代码如下:
AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView); ArrayAdapter<String> adapter =new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,COUNTRIES); textView.setAdapter(adapter);
下面出现的是源码内容
需要注意的是,我这里用到的AutoCompleteTextView的几个方法
1. setAdapter()方法:这里要传递的adapter参数必须是继承ListAdapter和Filterable的,其中arrayAdapter和simpleAdapter都能满足要求,我们常用arrayAdapter,因为他不需要像simpleAdapte那样设置他的显示位置和textview组件。
要想掌握它,就必须查看他的源码,我们可以看看arrayadapter是如何实现
凡是继承了Filterable的adapter都必须重写getFilter接口方法
[java] view
plaincopy
public Filter getFilter() {
if (mFilter == null) {
mFilter = new ArrayFilter();
}
return mFilter;
}
这个filter 就是实现过滤方法的对象,同样,我们可以查看他的源码是如何实现的
[java] view
plaincopy
/**
* <p>An array filter constrains the content of the array adapter with
* a prefix. Each item that does not start with the supplied prefix
* is removed from the list.</p>
*/
private class ArrayFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (mOriginalValues == null) {
synchronized (mLock) {
mOriginalValues = new ArrayList<T>(mObjects);
}
}
if (prefix == null || prefix.length() == 0) {
synchronized (mLock) {
ArrayList<T> list = new ArrayList<T>(mOriginalValues);
results.values = list;
results.count = list.size();
}
} else {
String prefixString = prefix.toString().toLowerCase();
final ArrayList<T> values = mOriginalValues;
final int count = values.size();
final ArrayList<T> newValues = new ArrayList<T>(count);
for (int i = 0; i < count; i++) {
final T value = values.get(i);
final String valueText = value.toString().toLowerCase();
// First match against the whole, non-splitted value
if (valueText.startsWith(prefixString)) {
newValues.add(value);
} else {
final String[] words = valueText.split(" ");
final int wordCount = words.length;
for (int k = 0; k < wordCount; k++) {
if (words[k].startsWith(prefixString)) {
newValues.add(value);
break;
}
}
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
这是arrayAdapter自定义的一个私有内部类,所谓私有,就意味着你不能通过继承去修改这种过滤方法,同样你也不能直接得到他过滤后结果集results。假如你想使用新的过滤方法,你必须重写getfilter()方法,返回的filter对象是你要新建的filter对象(在里面包含performFiltering()方法重新构造你要的过滤方法)
2.setDropDownHeight方法 ,用来设置提示下拉框的高度,注意,这只是限制了提示下拉框的高度,提示数据集的个数并没有变化
3.setThreshold方法,设置从输入第几个字符起出现提示
4.setCompletionHint方法,设置提示框最下面显示的文字
5.setOnFocusChangeListener方法,里面包含OnFocusChangeListener监听器,设置焦点改变事件
6.showdropdown方法,让下拉框弹出来
我没有用到的一些方法列举
1.clearListSelection,去除selector样式,只是暂时的去除,当用户再输入时又重新出现
2.dismissDropDown,关闭下拉提示框
3.enoughToFilter,这是一个是否满足过滤条件的方法,sdk建议我们可以重写这个方法
4. getAdapter,得到一个可过滤的列表适配器
5.getDropDownAnchor,得到下拉框的锚计的view的id
6.getDropDownBackground,得到下拉框的背景色
7.setDropDownBackgroundDrawable,设置下拉框的背景色
8.setDropDownBackgroundResource,设置下拉框的背景资源
9.setDropDownVerticalOffset,设置下拉表垂直偏移量,即是list里包含的数据项数目
10.getDropDownVerticalOffset ,得到下拉表垂直偏移量
11..setDropDownHorizontalOffset,设置水平偏移量
12.setDropDownAnimationStyle,设置下拉框的弹出动画
13.getThreshold,得到过滤字符个数
14.setOnItemClickListener,设置下拉框点击事件
15.getListSelection,得到下拉框选中为位置
16.getOnItemClickListener。得到单项点击事件
17.getOnItemSelectedListener得到单项选中事件
18.getAdapter,得到那个设置的适配器
相关文章推荐
- Android高级组件AutoCompleteTextView自动完成文本框使用详解
- 自动完成文本框(AutoCompleteTextView)的功能及用法
- 自动完成可编辑文本AutoCompleteTextView的使用
- 输入内容自动完成文本框(AutoCompleteTextView )
- 安卓自动完成文本框(autoCompleteTextView)
- Android -AutoCompleteTextView-简单又好用的自动完成文本框
- Android开发10.2:UI组件AutoCompleteTextView(自动完成文本框)
- MultiAutoCompleteTextView和AutoCompleteTextView两个自动完成功能控件的使用
- Android开发高级组件之自动完成文本框(AutoCompleteTextView)用法示例【附源码下载】
- Android组件复习之基本组件06—autocompletetextview自动完成文本框
- Android零基础入门第47节:自动完成文本框AutoCompleteTextView
- MultiAutoCompleteTextView和AutoCompleteTextView两个自动完成功能控件的使用
- 自动完成文本框(AutoCompleteTextView)的功能与用法
- Android:自动完成文本框(AutoCompleteTextView、MultiAutoCompleteTextView )
- [Android]笔记15:自动完成文本框(AutoCompleteTextView)的功能与用法
- Android自动编辑文本框(AutoCompleteTextView)使用方法详解
- MultiAutoCompleteTextView和AutoCompleteTextView两个自动完成功能控件的使用
- Android学习笔记(六)AutoCompleteTextView自动完成文本框
- Android入门教程四十四之 AutoCompleteTextView(自动完成文本框)的基本使用
- Android练习-----自动完成文本框(AutoCompleteTextView)(搜索框)