1. 程式人生 > >AutoCompleteTextView使用——自動完成文字框

AutoCompleteTextView使用——自動完成文字框

自動完成文字框(AutoCompleteTextView)從EditText繼承過來。因此它實質也是一個文字編輯框。但是比起普通的文字編輯框,AutoCompleteTextView多了一個功能:當用戶在文字編輯框中輸入一定文字之後,AutoCompleteTextView會顯示出一個包含使用者輸入內容的下拉選單,供使用者選擇,當用戶選擇其中的某個選單項後 ,AutoCompleteTextView會將使用者選擇的選單項自動填寫到該文字框,功能類似於百度或者Google在搜尋欄輸入資訊的時候,彈出的與輸入資訊接近的提示資訊。

在下面的XML介面佈局檔案中包含一個AutoCompleteTextView元件,介面佈局採用了線性佈局。在XML佈局檔案中,基本語法如下:

    <AutoCompleteTextView 
        屬性列表
        >
        
    </AutoCompleteTextView>

1)修改佈局檔案:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    >
    <AutoCompleteTextView 
        android:id="@+id/autoCompleteTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="7"
        android:text=""
        android:completionHint="輸入搜尋內容"
        android:completionThreshold="2"
        />
    <Button 
        android:id="@+id/searchBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/search"
        />

</LinearLayout>

2)在主活動onCreat()方法中,實現如下:
public class MainActivity extends Activity {

	private static final String[] COUNTRIES ={
		 "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra",
	     "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium",
	     "Cote d'Ivoire", "Cambodia", "Cameroon", "Canada", "Cape Verde",
	     "Democratic Republic of the Congo", "Denmark", "Djibouti", "Dominica",
	     "East Timor", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea",
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		final AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView);
		ArrayAdapter<String> adapter =new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,COUNTRIES);
		textView.setAdapter(adapter);
		
		Button button = (Button)findViewById(R.id.searchBtn);
		button.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this,textView.getText().toString(), Toast.LENGTH_LONG).show();
			}
		});
	}
}

在onCreat()方法中,建立一個儲存下拉選單中要顯示的列表項的ArrayAdepter介面卡,最後將該介面卡與自動完成文字框相關聯,關鍵程式碼如下:
AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView);
	ArrayAdapter<String> adapter =new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,COUNTRIES);
	textView.setAdapter(adapter);


下面出現的是原始碼內容 
               需要注意的是,我這裡用到的AutoCompleteTextView的幾個方法
               1. setAdapter()方法:這裡要傳遞的adapter引數必須是繼承ListAdapter和Filterable的,其中arrayAdapter和simpleAdapter都能滿足要求,我們常用arrayAdapter,因為他不需要像simpleAdapte那樣設定他的顯示位置和textview元件。
               要想掌握它,就必須檢視他的原始碼,我們可以看看arrayadapter是如何實現
              凡是繼承了Filterable的adapter都必須重寫getFilter介面方法

  1. public Filter getFilter() {  
  2.     if (mFilter == null) {  
  3.         mFilter = new ArrayFilter();  
  4.     }  
  5.     return mFilter;  
  6. }  
     這個filter 就是實現過濾方法的物件,同樣,我們可以檢視他的原始碼是如何實現的
  1. /** 
  2.     * <p>An array filter constrains the content of the array adapter with 
  3.     * a prefix. Each item that does not start with the supplied prefix 
  4.     * is removed from the list.</p> 
  5.     */
  6.    privateclass ArrayFilter extends Filter {  
  7.        @Override
  8.        protected FilterResults performFiltering(CharSequence prefix) {  
  9.            FilterResults results = new FilterResults();  
  10.            if (mOriginalValues == null) {  
  11.                synchronized (mLock) {  
  12.                    mOriginalValues = new ArrayList<T>(mObjects);  
  13.                }  
  14.            }  
  15.            if (prefix == null || prefix.length() == 0) {  
  16.                synchronized (mLock) {  
  17.                    ArrayList<T> list = new ArrayList<T>(mOriginalValues);  
  18.                    results.values = list;  
  19.                    results.count = list.size();  
  20.                }  
  21.            } else {  
  22.                String prefixString = prefix.toString().toLowerCase();  
  23.                final ArrayList<T> values = mOriginalValues;  
  24.                finalint count = values.size();  
  25.                final ArrayList<T> newValues = new ArrayList<T>(count);  
  26.                for (int i = 0; i < count; i++) {  
  27.                    final T value = values.get(i);  
  28.                    final String valueText = value.toString().toLowerCase();  
  29.                    // First match against the whole, non-splitted value
  30.                    if (valueText.startsWith(prefixString)) {  
  31.                        newValues.add(value);  
  32.                    } else {  
  33.                        final String[] words = valueText.split(" ");  
  34.                        finalint wordCount = words.length;  
  35.                        for (int k = 0; k < wordCount; k++) {  
  36.                            if (words[k].startsWith(prefixString)) {  
  37.                                newValues.add(value);  
  38.                                break;  
  39.                            }  
  40.                        }  
  41.                    }  
  42.                }  
  43.                results.values = newValues;  
  44.                results.count = newValues.size();  
  45.            }  
  46.            return results;  
  47.        }  
這是arrayAdapter自定義的一個私有內部類,所謂私有,就意味著你不能通過繼承去修改這種過濾方法,同樣你也不能直接得到他過濾後結果集results。假如你想使用新的過濾方法,你必須重寫getfilter()方法,返回的filter物件是你要新建的filter物件(在裡面包含performFiltering()方法重新構造你要的過濾方法)
          
         2.setDropDownHeight方法 ,用來設定提示下拉框的高度,注意,這只是限制了提示下拉框的高度,提示資料集的個數並沒有變化
         3.setThreshold方法,設定從輸入第幾個字元起出現提示
         4.setCompletionHint方法,設定提示框最下面顯示的文字
         5.setOnFocusChangeListener方法,裡面包含OnFocusChangeListener監聽器,設定焦點改變事件
         6.showdropdown方法,讓下拉框彈出來
         

        我沒有用到的一些方法列舉
1.clearListSelection,去除selector樣式,只是暫時的去除,當用戶再輸入時又重新出現
2.dismissDropDown,關閉下拉提示框
3.enoughToFilter,這是一個是否滿足過濾條件的方法,sdk建議我們可以重寫這個方法
4. getAdapter,得到一個可過濾的列表介面卡
5.getDropDownAnchor,得到下拉框的錨計的view的id
6.getDropDownBackground,得到下拉框的背景色
7.setDropDownBackgroundDrawable,設定下拉框的背景色
8.setDropDownBackgroundResource,設定下拉框的背景資源
9.setDropDownVerticalOffset,設定下拉表垂直偏移量,即是list裡包含的資料項數目
10.getDropDownVerticalOffset ,得到下拉表垂直偏移量
11..setDropDownHorizontalOffset,設定水平偏移量
12.setDropDownAnimationStyle,設定下拉框的彈出動畫
13.getThreshold,得到過濾字元個數
14.setOnItemClickListener,設定下拉框點選事件
15.getListSelection,得到下拉框選中為位置
16.getOnItemClickListener。得到單項點選事件
17.getOnItemSelectedListener得到單項選中事件
18.getAdapter,得到那個設定的介面卡