【Android基礎篇】AutoCompleteTextView和MultiAutoCompleteTextView

來源:互聯網
上載者:User

標籤:android   自動輸入文本   auto   complete   textview   

從名稱上可看出來,這兩個控制項都是用於輸入資訊的TextView,AutoComplete已表明這兩個控制項內容輸入都是自動完成的。區別在於一個是Multi,一個不是,具體的區別可通過下面的內容看出來。下面分別介紹著兩個控制項的使用。

AutoCompleteTextView 功能

動態匹配輸入的內容,如搜尋引擎在輸入框輸入資訊時,會有一個下拉式清單顯示與當前輸入內容有關的資訊。

控制項特有屬性

如同width、height等屬性是控制項共有屬性,下面介紹AutoCompleteTextView特有的屬性:
- android:completionThreshold : 此屬性用於設定當輸入多少字元時控制項開始進行自動匹配
- android:completionHint : 設定出現在下拉式功能表中的提示標題
- android:dropDownHorizontalOffset : 下拉式功能表於文字框之間的水平位移。預設與文字框靠左對齊
- android:dropDownHeight : 下拉式功能表的高度
- android:dropDownWidth : 下拉式功能表的寬度
- android:singleLine : 單行顯示
- android:dropDownVerticalOffset : 垂直位移量

如下,設定控制項在輸入1個字元後就開始自動匹配

<AutoCompleteTextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world"        android:completionThreshold="1" />
控制項在Activity中的使用

AutoCompleteTextView在Activity中的使用分為三步:
1. 執行個體化控制項,即通過findViewById找到控制項
2. 準備資料來源,資料來源裡的資料將與輸入內容進行匹配,匹配的就顯示在下拉式清單裡
3. 設定適配器,這一步與ListView等控制項一樣,我們需要適配器將資料域與介面串連起來

下面是一個執行個體:
1.建立工程

2.修改 actiivty_main 如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.twotextview.MainActivity" >    <AutoCompleteTextView        android:id="@+id/tv_auto"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text=""        android:completionThreshold="1" /></RelativeLayout>

3.MainActivity中代碼:

package com.twotextview;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.widget.ArrayAdapter;import android.widget.AutoCompleteTextView;public class MainActivity extends ActionBarActivity { private AutoCompleteTextView autoCompleteTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 1. 執行個體化控制項        this.autoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.tv_auto);        // 2. 準備資料來源,即下拉式清單中顯示的資料        String[] datas = new String[]{         "Hello",         "Hay",         "Ha",         "World",         "Word",         "Wa!"        };        // 3. 設定適配器,為控制項填充資料        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,          android.R.layout.simple_list_item_1,datas);        this.autoCompleteTextView.setAdapter(adapter);    }}

4.運行結果如下:

因為我們只是做一個簡單的Demo,所以在適配器的選擇上,選擇了最簡單的ArrayAdapter,如果要顯示圖文結合的,可以使用BaseAdapter或SimpleAdapter。

MultiAutoCompleteTextView 功能

可支援用分隔字元分開來選擇多個值,比如在發送郵件時的選擇連絡人、個人化裡選擇個人標籤等。
在輸入第一個值時,它能自動匹配,選擇完後,輸入分隔字元,在輸入內容時,它又可以自動匹配。

實現步驟
  1. 執行個體化控制項,即通過findViewById找到控制項
  2. 準備資料來源,資料來源裡的資料將與輸入內容進行匹配,匹配的就顯示在下拉式清單裡
  3. 設定適配器,這一步與ListView等控制項一樣,我們需要適配器將資料域與介面串連起來
  4. 設定分隔字元,可以自己建立分隔字元Tokenizer,也可以使用內部的預設以英文逗號為分隔字元的Tokenizer

下面是執行個體:
1.建立工程(也可以在上一個工程的基礎上修改)

2.修改 activity_main 檔案:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.twotextview.MainActivity" >    <MultiAutoCompleteTextView        android:id="@+id/tv_multiAuto"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text=""        android:completionThreshold="1"         /></RelativeLayout>

3.修改MainActivity:

package com.twotextview;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.widget.ArrayAdapter;import android.widget.AutoCompleteTextView;import android.widget.MultiAutoCompleteTextView;public class MainActivity extends ActionBarActivity { private MultiAutoCompleteTextView multiAutoCompleteTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 1. 執行個體化控制項        this.multiAutoCompleteTextView = (MultiAutoCompleteTextView) findViewById(R.id.tv_multiAuto);        // 2. 準備資料來源,即下拉式清單中顯示的資料        String[] datas = new String[]{         "Hello",         "Hay",         "Ha",         "World",         "Word",         "Wa!"        };        // 3. 設定適配器,為控制項填充資料        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,          android.R.layout.simple_list_item_1,datas);        this.multiAutoCompleteTextView.setAdapter(adapter);        // 4. 設定分隔字元        this.multiAutoCompleteTextView.setTokenizer(          new MultiAutoCompleteTextView.CommaTokenizer());    }}

其中與AutoCompleteTextView有所區別也只有設定分隔字元這一步;

4.運行結果:

在輸入了三條內容後,在輸入逗號分隔字元後,又可以開始自動匹配。

註:如果要使用自己自訂的分隔字元,需要寫一個類繼承Tokenizer介面,然後實現裡面的方法。這裡可以先查看MultiAutoCompleteTextView.CommaTokenizer()的源碼,然後再自己實現。附錄一下源碼:

/**     * 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 + ", ";                }            }        }    }

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

【Android基礎篇】AutoCompleteTextView和MultiAutoCompleteTextView

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.