今天分享一下使用AutoCompleteTextView与SharedPreferences实现自动提示历史数据
先简要介绍一下自动完成文本框:AutoCompleteTextView继承自EditText,实际上也是一个文本编辑框,不过比普通的文本框多一个功能——用户输入一定字符后,文本框显示自动提示的下拉列表。使用AutoCompleteTextView最简单的一种情况是自动提示的文本库是事先设定好的(不是输入的历史数据),这种情况只需为AutoCompleteTextView设置一个adapter即可,实现起来很简单,下面是一个简单的示例。
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<AutoCompleteTextView
android:id="@+id/auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:completionHint=""
android:completionThreshold="1"
/>
</LinearLayout></span>
布局很简单只有一个AutoCompleteTextView组件,completionHint是下拉提示信息,completionThreshold是设置输入多少字符会自动提示。下面是Activity的主要代码:
public class TestActivity extends Activity {
private AutoCompleteTextView autoTxt;
String[] data = new String[]{"恶魔巫师","噩梦骑士","大地之灵","大法师","DotA"};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
autoTxt = (AutoCompleteTextView)findViewById(R.id.auto);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line
,data);
autoTxt.setAdapter(adapter);
}
}
可以看出来实现非常简单,定义一个String数组作为ArrayAdapter的数据填充,找到
AutoCompleteTextView的实例并setAdapter。但是大部分时候我们需要的是能实现自动提示输入的历史信息,那么就要使用AutoCompleteTextView与SharedPreferences共同完成这个功能。
有时候我们需要输入框完成类似百度搜索,输入数据会自动提示,提示的内容就是之前的用户输入过得相关内容,只不过这里我们选择保存的缓存里。
简要介绍一下SharedPreferences,它位于Activity级别并且可以为应用程序内所有的Activity共享。
存储方式:采用键值对存储,只支持基本的数据类型存储,包括布尔型、浮点型、整形、长整型和字符串。
使用SharedPreferences的一般步骤:
1、获取SharedPreferences对象实例;
2、创建SharedPreferences.Editor来修改缓存内容;
3、使用commit提交修改的内容。
这里有两个关键的方法,第一个是对AutoCompleteTextView的初始化:
private void initAutoComplete(String field, AutoCompleteTextView auto) {
SharedPreferences sp = getSharedPreferences("network_url", 0);
String longhistory = sp.getString("history", "");
String[ ] hisArrays = longhistory.split(",");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
R.layout.item_history, hisArrays);
if (hisArrays.length > 50) {
String[] newArrays = new String[50];
System.arraycopy(hisArrays, 0, newArrays, 0, 50);
adapter = new ArrayAdapter<String>(this,
R.layout.item_history, newArrays);
}
auto.setAdapter(adapter);
auto.setDropDownHeight(350);
auto.setThreshold(1);
auto.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
AutoCompleteTextView view = (AutoCompleteTextView) v;
if (hasFocus && hisArrays.length > 0) {
view.showDropDown();
}
}
});
}
说一下比较关键的地方,hisArrays中是输入保存过的历史数据。粗体代码部分ArrayAdapter的三个参数:
Context:访问应用的接口,上下文。
texttViewResourceId:一个资源Id,该资源Id代表一个TextView,作为ArrayAdapter的列表项组件。这里需要注意的是一般使用的都是系统自带的样式文件,如果自定义的话,文件中必须只能有一个TextView布局。
数组或者List:数据源。AutoCompleteTextView的样式属性都能在文档中查到,这里不多说了。
第二个方法是将输入框中输入的数据保存到缓存中:
private void saveHistory(String field, AutoCompleteTextView auto) {
String text = auto.getText().toString();
SharedPreferences sp = getSharedPreferences("network_url", 0);
String longhistory = sp.getString(field, "");
if (!longhistory.contains(text + ",")) {
StringBuilder sb = new StringBuilder(longhistory);
sb.insert(0, text + ",");
sp.edit().putString("history", sb.toString()).commit();
}
}
这里需要注意的是两SharedPreferences 对象的名字必须一样,当不止一个页面想要访问同样的缓存的时候,这些文件中对SharedPreferences 的命名必须一样。
剩下的就是在适当的位置调用这两个方法,就可以实现自动提示的功能。
楼主系移动开发新手,如有问题欢迎大家一起讨论学习!