標籤: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
功能
可支援用分隔字元分開來選擇多個值,比如在發送郵件時的選擇連絡人、個人化裡選擇個人標籤等。
在輸入第一個值時,它能自動匹配,選擇完後,輸入分隔字元,在輸入內容時,它又可以自動匹配。
實現步驟
- 執行個體化控制項,即通過findViewById找到控制項
- 準備資料來源,資料來源裡的資料將與輸入內容進行匹配,匹配的就顯示在下拉式清單裡
- 設定適配器,這一步與ListView等控制項一樣,我們需要適配器將資料域與介面串連起來
- 設定分隔字元,可以自己建立分隔字元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