Activity

import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; public class MainActivity extends AppCompatActivity { private static final String[] COUNTRIES = new String[]{ "Belgium", "France", "Italy", "Germany", "Spain" }; private AutoCompleteTextView mAutoCompleteTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView); ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES); mAutoCompleteTextView.setAdapter(adapter); } }

XML

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="AutoCompleteTextView實(shí)現(xiàn)" android:textColor="@android:color/black" /> <AutoCompleteTextView android:id="@ id/autoCompleteTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:completionThreshold="1"/> </LinearLayout>

使用方法很簡(jiǎn)單,獲取到組件然后設(shè)置一個(gè)彈出的Adapter就能完成一個(gè)自動(dòng)提示。

但是這個(gè)組件有幾個(gè)特性不是很滿足我們的需求。
1.默認(rèn)是第二個(gè)字母開始匹配
2.整體內(nèi)容匹配模式 Belgium 我們只能輸入B ,Be,Bel等才會(huì)匹配
注:郵箱格式為123456@XX.com,整體內(nèi)容肯定不行。

下面我們又看到一個(gè)MultiAutoCompleteTextView組件,來看下MultiAutoCompleteTextView能否滿足我們的需求

import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.MultiAutoCompleteTextView; public class MainActivity extends AppCompatActivity { private static final String[] COUNTRIES = new String[]{ "Belgium", "France", "Italy", "Germany", "Spain" }; private AutoCompleteTextView mAutoCompleteTextView; private MultiAutoCompleteTextView mMultiAutoCompleteTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView); mMultiAutoCompleteTextView = (MultiAutoCompleteTextView) findViewById(R.id.multiAutoCompleteTextView); ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES); mAutoCompleteTextView.setAdapter(adapter); mMultiAutoCompleteTextView.setAdapter(adapter); mMultiAutoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); } }

XML

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="AutoCompleteTextView實(shí)現(xiàn)" android:textColor="@android:color/black" /> <AutoCompleteTextView android:id="@ id/autoCompleteTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:completionThreshold="1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="MultiAutoCompleteTextView實(shí)現(xiàn)" android:textColor="@android:color/black" /> <MultiAutoCompleteTextView android:id="@ id/multiAutoCompleteTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:completionThreshold="1" /> </LinearLayout>

Activity
經(jīng)過查詢API 我們知道 MultiAutoCompleteTextView 繼承于 AutoCompleteTextView 繼承于EditText

API中在MultiAutoCompleteTextView 提供了一個(gè)接口MultiAutoCompleteTextView.Tokenizer 可以用來匹配提示的子字符串。好吧,勉強(qiáng)能實(shí)現(xiàn)需求。
首先看MultiAutoCompleteTextView源碼中有一個(gè)對(duì)Tokenizer接口的實(shí)現(xiàn)!然后換成我們的。

/** * This simple Tokenizer can be used for lists where the items are * separated by a comma and one or more spaces. */ public static class CommaTokenizer implements Tokenizer { public int findTokenStart(CharSequence text, int cursor) { int i = cursor; while (i > 0 && text.charAt(i – 1) != \\\’,\\\’) { i–; } while (i < cursor && text.charAt(i) == \\\’ \\\’) { i ; } return i; } 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; } public CharSequence terminateToken(CharSequence text) { int i = text.length(); while (i > 0 && text.charAt(i – 1) == \\\’ \\\’) { i–; } if (i > 0 && text.charAt(i – 1) == \\\’,\\\’) { return text; } else { if (text instanceof Spanned) { SpannableString sp = new SpannableString(text ", "); TextUtils.copySpansFrom((Spanned) text, 0, text.length(), Object.class, sp, 0); return sp; } else { return text ", "; } } } }

根據(jù)MultiAutoCompleteTextView源碼中的實(shí)現(xiàn),我們知道Tokenizer的實(shí)現(xiàn)方式。

import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; import android.widget.MultiAutoCompleteTextView; public class EmailAutoTokenizer implements MultiAutoCompleteTextView.Tokenizer { @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; } @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; } @Override public CharSequence terminateToken(CharSequence text) { int i = text.length(); while (i > 0 && text.charAt(i – 1) == \\\’ \\\’) { i–; } if (i > 0 && text.charAt(i – 1) == \\\’@\\\’) { return text; } else { if (text instanceof Spanned) { SpannableString sp = new SpannableString(text); TextUtils.copySpansFrom((Spanned) text, 0, text.length(), Object.class, sp, 0); return sp; } else { return text; } } } }

在Activity中把Tokenizer換成我們自己的看下效果 mMultiAutoCompleteTextView.setTokenizer(new EmailAutoTokenizer());

import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.MultiAutoCompleteTextView; public class MainActivity extends AppCompatActivity { private String[] email_sufixs = new String[]{"@qq.com", "@163.com", "@126.com", "@gmail.com", "@sina.com", "@hotmail.com", "@yahoo.cn", "@sohu.com", "@foxmail.com", "@139.com", "@yeah.net", "@vip.qq.com", "@vip.sina.com"}; private AutoCompleteTextView mAutoCompleteTextView; private MultiAutoCompleteTextView mMultiAutoCompleteTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView); mMultiAutoCompleteTextView = (MultiAutoCompleteTextView) findViewById(R.id.multiAutoCompleteTextView); ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, email_sufixs); mAutoCompleteTextView.setAdapter(adapter); mMultiAutoCompleteTextView.setAdapter(adapter); mMultiAutoCompleteTextView.setTokenizer(new EmailAutoTokenizer()); } }

看下最后的效果圖,當(dāng)然我們還需要對(duì)彈出框進(jìn)行調(diào)整下,自己去查詢API吧!提供有方法。

正當(dāng)我高興的時(shí)候,萬惡的產(chǎn)品Dog給我加一個(gè)右邊刪除效果,丟一個(gè)驗(yàn)證規(guī)則過來!

在@之后輸入字母,從輸入的字母開始suggest郵箱
點(diǎn)擊suggest的郵箱,郵箱被輸入到郵箱輸入欄里,光標(biāo)移動(dòng)到下一text box
例:
1. 輸入:monoqn → 不suggest
1. 輸入:monoqn@ → 不suggest
1. 輸入:monoqn@i → monoqn@i.softbank.jp/monoqn@icloud.com
1. 輸入:monoqn@ic → monoqn@icloud.com

下面先驗(yàn)證規(guī)則:
1.在@之后輸入字母,從輸入的字母開始suggest郵箱。
很簡(jiǎn)單android:completionThreshold=”2” 設(shè)置輸入幾個(gè)字符之后顯示下拉菜單,默認(rèn)為2個(gè)。不用管就行
2.點(diǎn)擊suggest的郵箱,郵箱被輸入到郵箱輸入欄里,光標(biāo)移動(dòng)到下一text box
也簡(jiǎn)單MultiAutoCompleteTextView中有OnItemClickListener事件,

email.setOnItemClickListener((parent, view1, position, id) -> password.requestFocus());

3.顯示規(guī)則
看下了滿足需求,666666!

最后一個(gè)右邊加入刪除按鈕!本寶寶自定義一個(gè)就OK。

import android.content.Context; import android.graphics.drawable.Drawable; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.MultiAutoCompleteTextView; public class CleanableMultiAutoCompleteTextView extends MultiAutoCompleteTextView { private Drawable mRightDrawable; public CleanableMultiAutoCompleteTextView(Context context) { super(context); init(); } public CleanableMultiAutoCompleteTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CleanableMultiAutoCompleteTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { // getCompoundDrawables: // Returns drawables for the left, top, right, and bottom borders. Drawable[] drawables = this.getCompoundDrawables(); // get right drawable in layout.xml that is android:drawableRight mRightDrawable = drawables[2]; setOnFocusChangeListener(new FocusChangeListenerImpl()); addTextChangedListener(new TextWatcherImpl()); setClearDrawableVisible(false); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP: boolean isClean = (event.getX() > (getWidth() – getTotalPaddingRight())) && (event.getX() < (getWidth() – getPaddingRight())); if (isClean) { setText(""); } break; } return super.onTouchEvent(event); } private class FocusChangeListenerImpl implements OnFocusChangeListener { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { boolean isVisible = !TextUtils.isEmpty(getText()); setClearDrawableVisible(isVisible); } else { setClearDrawableVisible(false); } } } private class TextWatcherImpl implements TextWatcher { @Override public void afterTextChanged(Editable s) { boolean isVisible = !TextUtils.isEmpty(getText()); setClearDrawableVisible(isVisible); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // no-op } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // no-op } } public void setClearDrawableVisible(boolean isVisible) { Drawable rightDrawable = isVisible ? mRightDrawable : null; setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], rightDrawable, getCompoundDrawables()[3]); } }

 

更多關(guān)于云服務(wù)器,域名注冊(cè),虛擬主機(jī)的問題,請(qǐng)?jiān)L問三五互聯(lián)官網(wǎng):m.shinetop.cn

贊(2)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享網(wǎng)絡(luò)內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。郵箱:3140448839@qq.com。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明出處:三五互聯(lián)知識(shí)庫 » Android 郵箱自動(dòng)補(bǔ)全-MultiAutoCompleteTextView實(shí)現(xiàn)

登錄

找回密碼

注冊(cè)

主站蜘蛛池模板: 国产h视频在线观看| 起碰免费公开97在线视频| 亚洲人成网线在线播放VA | 久久亚洲国产成人亚| 国产亚洲一本大道中文在线 | 亚洲+成人+国产| 成人区人妻精品一区二区| 东京热人妻无码一区二区AV| 综合色一色综合久久网| 起碰免费公开97在线视频| 国产一区二区三区不卡视频| xx性欧美肥妇精品久久久久久| 国产乱色熟女一二三四区| 武清区| 中文字幕网红自拍偷拍视频| 嗯灬啊灬把腿张开灬动态图| 国产亚洲一级特黄大片在线| 人妻内射视频麻豆| 色综合中文字幕色综合激情| 高潮潮喷奶水飞溅视频无码| 国产久免费热视频在线观看| 国产精品福利自产拍久久| 蜜桃视频一区二区在线观看| 一区二区三区鲁丝不卡| av午夜福利一片免费看久久 | 婷婷久久香蕉五月综合加勒比| 亚洲精品日韩在线观看| 国产性色的免费视频网站| 亚洲综合黄色的在线观看| 精品人妻少妇一区二区三区在线| 欧美成人h亚洲综合在线观看| 临沧市| 99riav国产精品视频| 国产三级精品三级在线观看| 91区国产福利在线观看午夜| 狠狠人妻久久久久久综合蜜桃| 精品成人免费自拍视频| 欧美色欧美亚洲高清在线观看| 99精品久久久中文字幕| 九九热在线精品视频首页| 国产精品午夜福利资源|