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