Android UI系列-----EditText和AutoCompleteTextView

在這篇隨筆裏將主要講解一下EditText和AutoCompleteTextView這個控件android

1.EditTextweb

首先咱們先簡單來講說EditText這個控件,這個就至關於咱們日常web開發中的文本輸入框,咱們若是要使用EditText,能夠在佈局文件中聲明一個<EditText>這個元素便可,下面就是一個簡單的EditText的控件聲明:網絡

<EditText 
        android:id="@+id/username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="username"/>

對於EditText來講,其最重要的一個屬性是 android:inputType,這個屬性不只能夠指定鍵盤的顯示類型,還能控制一些其餘的操做,具體能夠參考android的官方API,其默認屬性是 android:inputType="text",也就是普通的鍵盤框,若是咱們設置其屬性爲如下這些,那麼其鍵盤的類型會有所不一樣:app

<EditText 
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="password"
        android:inputType="textPassword"/>  這個是咱們的密碼框
    
    <EditText
        android:id="@+id/email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="email"
        android:inputType="textEmailAddress"/>  當設置爲textEmailAddress時,鍵盤會多出來一個 @ 符號
    
    <EditText
        android:id="@+id/blog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="blog url"
        android:inputType="textUri"/>  設置爲textUri時,鍵盤會多出一個 / 符號
    
    <EditText
        android:id="@+id/phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="phone"
        android:inputType="phone"/>  設置爲phone時,鍵盤就會變成一個打電話時的鍵盤
    
    <EditText
        android:id="@+id/counts"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="counts"
        android:inputType="number"/>  設置爲number時,鍵盤上所有都是數字鍵

對於輸入框來講,咱們一般都要對其輸入的數據進行判斷,inputType這個屬性不會對咱們輸入的內容進行校驗,若是咱們要對輸入的內容進行校驗,咱們須要在Activity裏面進行操做ide

EditText有一個setError的方法,當調用這個方法時,則表示輸入的數據不合法,咱們來看看官方的API對該方法的解釋:佈局

void android.widget.TextView.setError(CharSequence error)

Sets the right-hand compound drawable of the TextView to the "error" icon and sets an error message that will be displayed in a popup when the TextView has focus. The icon and error message will be reset to null when any key events cause changes to the TextView's text. If the error is null, the error message and icon will be cleared.

這個方法會給咱們一個錯誤的小圖標以及彈出的一段錯誤提示信息,當咱們的這個EditText控件得到焦點的時候,當咱們在文本框中輸入了任何的值後,這個icon和message都會消失,例如:ui

EditText還有許多其餘的方法,這個在之後實際用的的時候再闡述。this

2.AutoCompleteTextViewurl

AutoCompleteTextView這個是一個自動提示內容的文本框,其是EditText的一個子類,spa

An editable text view that shows completion suggestions automatically while the user is typing. The list of suggestions is displayed in a drop down menu from which the user can choose an item to replace the content of the edit box with.

The drop down can be dismissed at any time by pressing the back key or, if no item is selected in the drop down, by pressing the enter/dpad center key.

咱們一般都是本身定義了一組數據集合,能夠是array,能夠是list,還能夠是網絡傳過來的數據,這組數據是如下拉菜單的方式根據咱們輸入的關鍵字來匹配咱們數據集合中知足條件的數據項,經過下拉菜單,咱們能夠enter來選中咱們須要的數據,而爲AutoCompleteTextView這個控件提供內容的就是咱們的 Adapter ,這個叫作適配器,Adapter這個類的做用就是在咱們的Data和咱們的View之間架設一座橋樑,咱們將咱們的數據放置到一個Adapter當中,而後經過指定咱們對這些數據的佈局方式,再將這個Adapter賦給咱們的View。

Adapter是一個接口,其擁有許多的實現類,例如:

android.widget.Adapter
Known Indirect Subclasses:
ArrayAdapter
<T>, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter

咱們看到,Android爲咱們提供了許多的Adapter,這是由於咱們的數據可能來自不一樣的途徑,並且對於一些特殊的控件,例如Spinner,咱們也要有指定的SpinnerAdapter才行,接下來咱們就經過一個例子來實現咱們的 AutoCompleteTextView 文本提示功能:

首先咱們在咱們的佈局文件中定義一個 <AutoCompleteTextView>標籤,例如:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/country"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="所在國家:" />

    <AutoCompleteTextView
        android:id="@+id/auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/country"/>
    
</RelativeLayout>

接下來咱們看看Activity裏面的內容:

public class AutoCompleteActivity extends Activity
{
    private AutoCompleteTextView auto;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.auto_complete);
    
        auto = (AutoCompleteTextView)findViewById(R.id.auto);
        
        List<String> countries = new ArrayList<String>();
        countries.add("Afghanistan");
        countries.add("Albania");
        countries.add("Algeria");
        countries.add("American");
        countries.add("Andorra");
        countries.add("Anguilla");
        countries.add("Angola");
        countries.add("Antarctica");
        countries.add("China");
        
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, countries);
        
        auto.setAdapter(adapter);
        
    }
}

咱們看到,在Activity裏面咱們定義了一個ArrayAdapter這個類,其有許多的構造方法,咱們來看看咱們用的這個:

public ArrayAdapter (Context context, int resource, List<T> objects)

Parameters
context    The current context.
resource    The resource ID for a layout file containing a TextView to use when instantiating views.
objects    The objects to represent in the ListView.

第一個參數Context類型的對象,是咱們的上下文對象,咱們的Activity是Context類的子類,因此能夠將當前的這個Activity傳進去,第二個參數是一個包含了TextView控件的佈局文件的ID,當Adapter加載的時候,就會將咱們的數據集合的每個數據(item)綁定爲咱們這個佈局文件中的每個TextView控件上,android系統自己給咱們提供了許多的默認的佈局文件,咱們這裏使用的是  android.R.layout.simple_list_item_1 這個佈局文件(this is a layout provided by Android that provides a standard appearance for text in a list),第三個參數就是咱們的數據集合,這裏咱們傳入一個List進去,最後經過setAdapter(adapter)方法將其綁定到咱們的AutoCompleteTextView控件上便可。

對於咱們的數據集,咱們除了能夠在Activity中聲明一個List或者是Array覺得,咱們還能夠寫在android的資源文件中,經過資源文件來獲得咱們的數據集,例如,咱們在

res-->values-->strings.xml 這個文件中指定咱們的數據集:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Android_01</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    
    <string-array name="countries">
        <item>Bahrain</item>
        <item>Bangladesh</item>
        <item>Belarus</item>
        <item>Belize</item>
        <item>Brazil</item>
        <item>Cameroon</item>
        <item>Japan</item>
        <item>Hongkong</item>
        <item>Greece</item>
        <item>Germany</item>
        <item>France</item>
        <item>Djibouti</item>
        <item>Denmark</item>
        <item>Canada</item>
    </string-array>

</resources>

而後在代碼中,咱們能夠經過下面這種方式來建立咱們的Adapter對象:

String[] countries2 = getResources().getStringArray(R.array.countries);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, countries2);
        

最後咱們來看看效果圖:

當咱們輸入兩個字母時,就會有內容提示了,咱們能夠選擇咱們須要的選項,點擊enter便可。

相關文章
相關標籤/搜索