<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android實現(xiàn)登錄郵箱的自動補全功能

          共 3874字,需瀏覽 8分鐘

           ·

          2022-06-07 23:10

          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()方法一次 */ @Override public boolean enoughToFilter() { // 若用戶輸入的文本字符串中包含'@'字符且不在第一位,則滿足條件返回true,否則返回false return getText().toString().contains("@") && getText().toString().indexOf("@") > 0; }}


          如果需要輸入的第一個字符是“@”就聯(lián)想郵箱只需要改為以下代碼即可。

          @Override    public 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     */    @Override    public 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 */ @Override public 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 */ @Override public 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); ArrayAdapter adapter = new ArrayAdapter<>(this, R.layout.item_associate_mail_list,                R.id.tv_recommend_mail, recommendMailBox); mUserNameAssociateView.setAdapter(adapter); mUserNameAssociateView.setTokenizer(new MailBoxAssociateTokenizer());


          到這里就結(jié)束啦。

          瀏覽 78
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕有码第一页 | 日韩视频久久 | 久操资源 | 欧美乱伦中文字幕 | 日本三级日产三级国产三级 |