本節繼續學習采用 Adapter 實現的控件,如果你希望用戶在輸入文本的過程中能夠得到文本補全建議,那么 AutoCompleteTextView 將是一個非常不錯的選擇。比如在搜索引擎的場景下就很適用,大家應該都有體會,在百度搜索框輸入要搜索的關鍵詞,如果需要等全部輸入完畢敲回車才出結果,那將是一種很差的體驗;
而實際上百度是在我們輸入的過程中實時的自動預判我們要輸入的內容,然后幫我們補全關鍵詞,這時候我們可以直接選擇系統的補全方案而減少很多不必要的時間,大大提高了搜索效率,體驗非常棒。
1. AutoCompleteTextView 的特性
AutoCompleteTextView 派生自 EditText,擁有 EditText 的所有屬性和 API(關于 EditText 的詳細講解,可參見第 14 節)。它提供一個輸入框,并在 EditText 的基礎之上增加了輸入過程中的實時文本自動補全的功能,我們可以通過 Adapter 實現補全列表和補全數據的綁定,就和 ListView 一樣,這個效果對于用戶的輸入體驗提升是非常大的。
2. AutoCompleteTextView 的基本用法
2.1 常用屬性
AutoCompleteTextView 是繼承自 EditText 的,所以 EditText 的屬性它全都可以適用,這里主要講解 AutoCompleteTextView 特有的屬性。
- android:completionHint:
設置下拉菜單中的提示信息 - android:completionHintView:
設置提示菜單的布局樣式 - android:completionThreshold:
指定當用戶輸入多少字符的時候開始提示 - android:dropDownAnchor:
指定自動補全下拉菜單的錨點 View,系統默認使用該當前 TextView 作為定位錨點 View - android:dropDownHeight:
設置下拉菜單的高度 - android:dropDownWidth:
設置下拉菜單的寬度 - android:dropDownHorizontalOffset:
設置下拉菜單的水平間距 - android:dropDownVerticalOffset:
設置下拉菜單的豎直間距 - android:dropDownSelector:
設置下拉菜單點擊效果,類似Button - android:popupBackground:
設置下拉菜單的背景樣式
2.2 AutoCompleteTextView 的 API
AutoCompleteTextView 作為升級版的 EditText,要用到 API 的地方并不多,大多數場景還需要掌握屬性的設置就行,這里對 API 做一個簡單的講解。
- getAdapter()
返回一個 ListAdapter 類型的 adapter ,即我們代碼中綁定的 adapter 對象。 - getCompletionHint()
獲取當前匹配的補全信息列表 - getDropDownAnchor()
獲取下拉補全列表的錨定 View 的 id - getListSelection()
獲取下拉列表中被選中的選項所在的位置 - isPopupShowing()
判斷下拉菜單是否彈出 - showDropDown()
彈出下拉菜單
3. AutoCompleteTextView 示例
3.1 編寫布局文件
布局文件很簡單,只需要在根布局的位置添加一個 AutoCompleteTextView 標簽,然后加上適當的屬性即可:
<?xml version="1.0" encoding="utf-8"?>
<AutoCompleteTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/autoCompleteTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:completionHint="請輸入您要查找的內容"
android:completionThreshold="1"
android:dropDownHorizontalOffset="10dp" />
通過android:completionHint
設置當前 AutoCompleteTextView 的功能提示,android:completionThreshold="1"
表示當用戶輸入一個字符時就開始做補全提示,最后通過android:dropDownHorizontalOffset
設置一個水平間距。
3.2 編寫 Java 代碼
Java 代碼相對比較簡單,因為補全的結果是一個字符串數組,補全列表的列表項也都是單個項目,所以這里直接使用ArrayAdapter
再好不過(關于 ArrayAdapter 的使用詳見 23 節),代碼如下:
package com.emercy.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
public class MainActivity extends Activity {
private AutoCompleteTextView mTextView;
private String[] mDataName = {"慕課", "慕課網", "慕課Android教程", "慕斯蛋糕", "慕容復"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.autoCompleteTextView);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, mDataName);
mTextView.setAdapter(adapter);
}
}
首先我們將補全項存入字符串數組中,然后獲取 AutoCompleteTextView 對象,創建 ArrayAdapter,最后為 AutoCompleteTextView 對象指定 Adapter 即可。
其中在創建 ArrayAdapter 的時候我們傳入了一個 id 為android.R.layout.simple_dropdown_item_1line
的布局文件,它是 Android 系統為我們內置的專門用于下拉菜單使用的布局文件,其實里面只有一個 TextView 用于顯示下拉菜單項,查看源碼如下:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/dropDownItemStyle"
android:textAppearance="?android:attr/textAppearanceLargePopupMenu"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:ellipsize="marquee" />
我們在使用下拉菜單類型的樣式時都可考慮直接采用系統樣式,最終編譯出來屏幕中有一個輸入框,我們輸入一個“慕”字,會展示以慕開頭的所有可補全的字符串,結果如圖所示:
4. 小結
本節學習了 EditText 的升級版,同時也是有一個使用 Adapter 的控件。它除了能提供和 EditText 一樣的輸入功能之外,還能通過 Adapter 加載一個字符串數組,在用戶輸入的同時為用戶實現實時自動補全,在搜索查找的場景非常適用。
到這里已經學習了很多和 Adpater 有關的 UI 組件了,大家有沒有發現 Adapter 的一些規律?這個問題留給大家在課后思考,也希望大家在學習的過程中能夠不斷歸納總結。