您的位置:首页 > 其它

AutoCompleteTextView使用——自动完成文本框

2013-10-03 22:12 519 查看
自动完成文本框(AutoCompleteTextView)从EditText继承过来。因此它实质也是一个文本编辑框。但是比起普通的文本编辑框,AutoCompleteTextView多了一个功能:当用户在文本编辑框中输入一定文本之后,AutoCompleteTextView会显示出一个包含用户输入内容的下拉菜单,供用户选择,当用户选择其中的某个菜单项后
,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,得到那个设置的适配器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐