使用AutoCompleteTextView与SharedPreferences实现自动提示历史数据

本文介绍了如何在Android中结合AutoCompleteTextView和SharedPreferences实现自动提示历史数据的功能。通过设置AutoCompleteTextView的适配器,并利用SharedPreferences存储和读取历史输入数据,实现了类似百度搜索的自动提示效果。同时,详细讲解了SharedPreferences的使用步骤,包括获取实例、创建Editor以及提交修改。最后,提供了初始化AutoCompleteTextView和保存输入数据到缓存的关键代码段。
摘要由CSDN通过智能技术生成

今天分享一下使用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 的命名必须一样。

剩下的就是在适当的位置调用这两个方法,就可以实现自动提示的功能。

楼主系移动开发新手,如有问题欢迎大家一起讨论学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值