首先,来看效果
下面是实现的代码
- package cn.sumile.autocompleteedittext;
- import java.util.ArrayList;
- import android.content.Context;
- import android.text.Editable;
- import android.text.TextWatcher;
- import android.util.AttributeSet;
- import android.widget.EditText;
- public class AutoCompleteEditText extends EditText {
- private ArrayList mResultsValues = new ArrayList();
- /**
- * @param mResultsValues
- * 自动提示的字符串 list
- */
- public void setResultsValues(ArrayList mResultsValues) {
- this.mResultsValues = mResultsValues;
- }
- public AutoCompleteEditText(Context context) {
- this(context, null);
- }
- public AutoCompleteEditText(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
- public AutoCompleteEditText(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- this.addTextChangedListener(new TextWatcher() {
- String strNow = null;
- String strOld = null;
- int strLength = -1;
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- strNow = s.toString();
- }
- @Override
- public void afterTextChanged(Editable s) {
- int startPositon = AutoCompleteEditText.this.getSelectionStart();
- int endPositon;
- // 第一阶段代码
- if (strOld != null) {
- //
- if (strOld.length() != 0)
- if (strOld.equals(strNow)) {
- // 判断是否是结尾
- strOld = strNow;
- return;
- }
- if (strNow.length() < = strOld.length()) {
- // 防止删除的时候重新进入到第二阶段代码
- strOld = strNow;
- return;
- }
- }
- // 第二阶段代码
- for (int i = 0; i < mResultsValues.size(); i++) {
- strDef = mResultsValues.get(i);
- if (strDef.startsWith(strNow) && !strDef.equals(strNow)) {
- // 防止用户在从最后一位删除字符的时候字符串重新变回元字符串(如 sumile, 删除,成为 sumile,两者的区别是后面的 sumile 中的 e 是被选中的状态)
- if (strDef.substring(0, strDef.length() - 1).equals(strNow)) {
- strOld = strNow;
- return;
- }
- // 获得字符串的末尾
- endPositon = strDef.length();
- // 将上一个字符设置为新的字符
- strOld = strNow;
- // 设置文本显示
- AutoCompleteEditText.this.setText(strDef);
- // 设置文本选择
- AutoCompleteEditText.this.setSelection(startPositon, endPositon);
- // 这个 break 貌似不起作用,但是也没有把它删掉
- break;
- }
- }
- }
- });
- }
- private String strDef = null;
- }
调用方式
在 xml 中这样声明:
- <cn.sumile.autocompleteedittext.AutoCompleteEditText
- android:id="@+id/et"
- android:layout_width="match_parent"
- android:layout_height="50dip"
- android:ems="10"
- android:focusable="true"
- android:focusableInTouchMode="true"
- android:hint="默认字符" >
- <requestFocus />
- </cn.sumile.autocompleteedittext.AutoCompleteEditText>
代码里面的调用(主要是设置要提示的内容):
jar 包下载 测试代码下载
- private ArrayList values = new ArrayList();
- values.add("baidu.com");
- values.add("sumile.cn");
- values.add("sunile.cn");
- values.add("sunule.cn");
- values.add("samile.cn");
- values.add("sakile.cn");
- et = (SelectText) findViewById(R.id.et);
- et.setResultsValues(values);
转载请注明:热爱改变生活.cn » EditText 自动补全功能
本博客只要没有注明“转”,那么均为原创。 转载请注明链接:sumile.cn » EditText 自动补全功能