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 10311℃ 0评论

首先,来看效果

autocomplete

下面是实现的代码

  1. package cn.sumile.autocompleteedittext;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. import android.content.Context;
  6. import android.text.Editable;
  7. import android.text.TextWatcher;
  8. import android.util.AttributeSet;
  9. import android.widget.EditText;
  10.  
  11. public class AutoCompleteEditText extends EditText {
  12. private ArrayList mResultsValues = new ArrayList();
  13. /**
  14. * @param mResultsValues
  15. * 自动提示的字符串 list
  16. */
  17. public void setResultsValues(ArrayList mResultsValues) {
  18. this.mResultsValues = mResultsValues;
  19. }
  20. public AutoCompleteEditText(Context context) {
  21. this(context, null);
  22. }
  23. public AutoCompleteEditText(Context context, AttributeSet attrs) {
  24. this(context, attrs, 0);
  25. }
  26.  
  27. public AutoCompleteEditText(Context context, AttributeSet attrs, int defStyle) {
  28. super(context, attrs, defStyle);
  29. this.addTextChangedListener(new TextWatcher() {
  30. String strNow = null;
  31. String strOld = null;
  32. int strLength = -1;
  33.  
  34. @Override
  35. public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  36. }
  37.  
  38. @Override
  39. public void onTextChanged(CharSequence s, int start, int before, int count) {
  40. strNow = s.toString();
  41. }
  42. @Override
  43. public void afterTextChanged(Editable s) {
  44. int startPositon = AutoCompleteEditText.this.getSelectionStart();
  45. int endPositon;
  46. // 第一阶段代码
  47. if (strOld != null) {
  48. //
  49. if (strOld.length() != 0)
  50. if (strOld.equals(strNow)) {
  51. // 判断是否是结尾
  52. strOld = strNow;
  53. return;
  54. }
  55. if (strNow.length() < = strOld.length()) {
  56. // 防止删除的时候重新进入到第二阶段代码
  57. strOld = strNow;
  58. return;
  59. }
  60. }
  61. // 第二阶段代码
  62. for (int i = 0; i < mResultsValues.size(); i++) {
  63. strDef = mResultsValues.get(i);
  64. if (strDef.startsWith(strNow) && !strDef.equals(strNow)) {
  65. // 防止用户在从最后一位删除字符的时候字符串重新变回元字符串(如 sumile, 删除,成为 sumile,两者的区别是后面的 sumile 中的 e 是被选中的状态)
  66. if (strDef.substring(0, strDef.length() - 1).equals(strNow)) {
  67. strOld = strNow;
  68. return;
  69. }
  70. // 获得字符串的末尾
  71. endPositon = strDef.length();
  72. // 将上一个字符设置为新的字符
  73. strOld = strNow;
  74. // 设置文本显示
  75. AutoCompleteEditText.this.setText(strDef);
  76. // 设置文本选择
  77. AutoCompleteEditText.this.setSelection(startPositon, endPositon);
  78. // 这个 break 貌似不起作用,但是也没有把它删掉
  79. break;
  80. }
  81. }
  82. }
  83. });
  84. }
  85. private String strDef = null;
  86.  
  87. }
  88.  

调用方式

在 xml 中这样声明:

  1. <cn.sumile.autocompleteedittext.AutoCompleteEditText
  2. android:id="@+id/et"
  3. android:layout_width="match_parent"
  4. android:layout_height="50dip"
  5. android:ems="10"
  6. android:focusable="true"
  7. android:focusableInTouchMode="true"
  8. android:hint="默认字符" >
  9.  
  10. <requestFocus />
  11. </cn.sumile.autocompleteedittext.AutoCompleteEditText>

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

  1. private ArrayList values = new ArrayList();
  2. values.add("baidu.com");
  3. values.add("sumile.cn");
  4. values.add("sunile.cn");
  5. values.add("sunule.cn");
  6. values.add("samile.cn");
  7. values.add("sakile.cn");
  8. et = (SelectText) findViewById(R.id.et);
  9. et.setResultsValues(values);
jar 包下载 测试代码下载
¥ 有帮助么?打赏一下~

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


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

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

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

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

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