Android實現(xiàn)登錄郵箱的自動補全功能
Android SDK 提供了MultiAutoCompleteTextView 控件,可以支持從指定字符開始聯(lián)想,MultiAutoCompleteTextView 通過分詞器 Tokenizer,可以支持連續(xù)提示
下面是運行效果圖:

只要輸入“@”符號就會自動聯(lián)想郵箱。
下面是自定義的 MailBoxAssociateView 類繼承于AppCompatMultiAutoCompleteTextView 控件,來實現(xiàn)聯(lián)想郵箱組件。
/*** @desciption: 郵箱聯(lián)想控件,輸入 @ 符后開始聯(lián)想*/public class MailBoxAssociateView extends AppCompatMultiAutoCompleteTextView {public MailBoxAssociateView(Context context) {super(context);}public MailBoxAssociateView(Context context, AttributeSet attrs) {super(context, attrs);}public MailBoxAssociateView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}/*** 當輸入@符號時,就會去調(diào)用Tokenizer.findTokenStart()方法一次* 當點擊下拉提示框中的某個信息時,會再次調(diào)用Tokenizer.findTokenStart()方法一次,然后再調(diào)用terminateToken()方法一次*/@Overridepublic boolean enoughToFilter() {// 若用戶輸入的文本字符串中包含'@'字符且不在第一位,則滿足條件返回true,否則返回falsereturn getText().toString().contains("@") && getText().toString().indexOf("@") > 0;}}
如果需要輸入的第一個字符是“@”就聯(lián)想郵箱只需要改為以下代碼即可。
@Overridepublic boolean enoughToFilter() {return getText().toString().contains("@") ;}
自定義分詞器 MailBoxAssociateTokenizer 類,指定從哪個地方開始聯(lián)想字符。
/*** @desciption: 指定從哪個地方開始聯(lián)想字符*/public class MailBoxAssociateTokenizer implements MultiAutoCompleteTextView.Tokenizer {/*** 用于查找當前光標位置之前的分隔符的位置并返回** @param text 用戶已經(jīng)輸入的文本內(nèi)容* @param cursor 當前光標的位置,在文本內(nèi)容后面* @return*/@Overridepublic int findTokenStart(CharSequence text, int cursor) {int index = text.toString().indexOf("@");if (index < 0) {index = text.length();}if (index > findTokenEnd(text, cursor)) {index = 0;}return index;}/*** 用于查找當前光標位置之后的分隔符的位置并返回,向后查詢** @param text 用戶已經(jīng)輸入的文本內(nèi)容* @param cursor 當前光標的位置,在文本內(nèi)容之間* @return*/@Overridepublic int findTokenEnd(CharSequence text, int cursor) {int i = cursor;int len = text.length();// 向后查找'@'字符,若找到則直接返回其所在位置while (i < len) {if (text.charAt(i) == '@') {return i;} else {i++;}}return len;}/*** 用于返回提示信息加上分隔符后的文本內(nèi)容** @param text* @return*/@Overridepublic CharSequence terminateToken(CharSequence text) {int i = text.length();//去掉原始匹配的數(shù)據(jù)的末尾空格while (i > 0 && text.charAt(i - 1) == ' ') {i--;}//判斷原始匹配的數(shù)據(jù)去掉末尾空格后是否含有'@',有則立即返回if (i > 0 && text.charAt(i - 1) == '@') {return text;} else {// CharSequence類型的數(shù)據(jù)有可能是富文本SpannableString類型// 故需要進行判斷if (text instanceof Spanned) {SpannableString sp = new SpannableString(text);// 故需要借助TextUtils.copySpansFrom從text中復制原來的樣式到新的sp中,// 以保持原先樣式不變情況下添加一個逗號和空格TextUtils.copySpansFrom((Spanned) text, 0, text.length(), Object.class, sp, 0);return sp;} else {return text;}}}}
布局文件 :
android:id="@+id/associate_email_input"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="57dp"android:hint="@string/account"android:paddingLeft="5dp"android:paddingBottom="12dp"android:popupBackground="@drawable/bg_recommend_mail_list"android:singleLine="true"android:textColor="@color/color_333333"android:textColorHint="@color/color_bfbfbf"android:textSize="16sp"/>
使用方式
在 values 中創(chuàng)建 arrays.xml 文件
- \@gmail.com
- \@hotmail.com
- \@yahoo.com
- \@outlook.com
- \@aol.com
- \@hotmail.co.uk
- \@yahoo.co.uk
- \@mail.ru
- \@rediffmail.com
- \@live.com
- \@msn.com
在 Activity中使用
mUserNameAssociateView = findViewById(R.id.associate_email_input);String[] recommendMailBox = getResources().getStringArray(R.array.recommend_mail_box);ArrayAdapteradapter = new ArrayAdapter<>(this, R.layout.item_associate_mail_list, R.id.tv_recommend_mail, recommendMailBox);mUserNameAssociateView.setAdapter(adapter);mUserNameAssociateView.setTokenizer(new MailBoxAssociateTokenizer());
到這里就結(jié)束啦。
評論
圖片
表情
