EditText 自动补全功能 – 热爱改变生活
我的GitHub GitHub |     登录
  • If you can't fly, then run; if you can't run, then walk; if you can't walk, then crawl
  • but whatever you do, you have to keep moving forward。
  • “你骗得了我有什么用,这是你自己的人生”
  • 曾有伤心之地,入梦如听 此歌

EditText 自动补全功能

Android控件 sinvader 9860℃ 0评论

首先,来看效果

autocomplete

下面是实现的代码

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>

代码里面的调用(主要是设置要提示的内容):

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);
jar 包下载 测试代码下载
¥ 有帮助么?打赏一下~

转载请注明:热爱改变生活.cn » EditText 自动补全功能


本博客只要没有注明“转”,那么均为原创。 转载请注明链接:sumile.cn » EditText 自动补全功能

喜欢 (0)
发表我的评论
取消评论
表情

如需邮件形式接收回复,请注册登录

Hi,你需要填写昵称和邮箱~

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址