首先,来看效果
下面是实现的代码
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 自动补全功能






