1. 程式人生 > >android AutoCompleteTextView 實現輸入提示,類似百度支援輸入拼音提示中文(gray)

android AutoCompleteTextView 實現輸入提示,類似百度支援輸入拼音提示中文(gray)

 android 的 AutoCompleteTextView 控制元件實現了輸入框的輸入提示功能,這個功能更加使用於國外的手機使用者來使用。而很多時候國人更多的是要象百度那樣我輸入的是拼音也能將中文提示出來,如:輸入xinlang  就能提示:新浪、新浪微博等。又或者是輸入:xl 拼音首字母也能做到。這樣的提示才是更加的符合國人的習慣。

先上圖,看效果:


        先簡單的介紹下AutoCompleteTextView 控制元件的基本用法:這個在android的sdk裡也是有介紹的,下面是sdk中介紹的實現程式碼:

publicclassCountriesActivity
extendsActivity{protectedvoid onCreate(Bundle icicle){super.onCreate(icicle);          setContentView(R.layout.countries);ArrayAdapter<String> adapter =newArrayAdapter<String>(this,                  android.R.layout.simple_dropdown_item_1line, COUNTRIES);AutoCompleteTextView textView =(AutoCompleteTextView
)                  findViewById(R.id.countries_list);          textView.setAdapter(adapter);}privatestaticfinalString[] COUNTRIES =newString[]{"Belgium","France","Italy","Germany","Spain"};}
從上面的程式碼可到實現這個功能是很簡單的,只要將一個要提示的陣列繫結到ArrayAdapter中,再將ArrayAdapter和 AutoCompleteTextView 控制元件繫結一起。

下面來說下我的功能的實現方式:

public class AutoTestActivity extends Activity {
    /** Called when the activity is first created. */
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        addItems();
        AutoCompleteTextView ac = (AutoCompleteTextView)findViewById(R.id.autocomplete);
        SimpleAdapter notes = new SimpleAdapter( 
        this, 
        list,
        R.layout.main_item_three_line_row,
        new String[] { "brandSearchText", "brandName"},
        new int[] { R.id.searchText, R.id.brandName } );        
        ac.setAdapter(notes);
        ac.setThreshold(1);

ac.setOnItemClickListener(new OnItemClickListener(){



@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
TextView tv = (TextView)arg1.findViewById(R.id.brandName);
ac.setText(tv.getText().toString()+" ");
ac.setSelection((ac.getText().toString()).length());
}

});
    }
    
    private void addItems() {
    HashMap<String,String> item;


    item = new HashMap<String,String>();
    item.put( "brandSearchText", "NOKIA nuojiya NJY");
    item.put( "brandName", "諾基亞");
    list.add( item );


    item = new HashMap<String,String>();
    item.put( "brandSearchText", "SVMSUN SX sanxing");
    item.put( "brandName", "三星");
    list.add( item );
   
   
    item = new HashMap<String,String>();
    item.put( "brandSearchText", "摩托羅拉  moto MTLL motuoluola motoloar");
    item.put( "brandName", "摩托羅拉");
    list.add( item );


    }


}

1.我這裡將不使用ArrayAdapter而是用SimpleAdapter。

2.用程式把所有的搜尋詞語拼接成brandSearchText欄位,用空格隔開。比如:“諾基亞 NOKIA  njy nuojiya”,把它作為搜尋詞。    注意這個拼接過程應該只做一次,然後儲存在靜態變數裡面,以便提高效率。因為只要你的提示詞的一多資料量大了就會使提示的速度減慢。 還有就是這裡最好是把要提示的文字放在brandName欄位 如“諾基亞”,這樣的話就不要在searchText欄位中新增“諾基亞”不然提示會出現重複。 將準備好的方法放在ArrayList<HashMap<String,String>>中這裡的資料也可以是從資料庫中新增 3.然後再將資料放到SimpleAdapter 中與AutoCompleteTextView 繫結自定義一個提示顯示的listItem佈局,在佈局只用的顯示brandSearchText欄位資料的textview隱藏: <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/brandName" />

<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/searchText"
android:visibility="gone" />
</LinearLayout>
4.這樣就不會把不需要顯示的內容顯示出來。 到這裡還有最後一步,如果不做的話這裡點選提示詞的某一行後,顯示在輸入框中的內容將會是這樣的:{brandName=三星,brandSearchText=SVMSUN SX sanxing} 所以最後我們要對item的點選事件做處理:

ac.setOnItemClickListener(new OnItemClickListener(){

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
TextView tv = (TextView)arg1.findViewById(R.id.brandName);
ac.setText(tv.getText().toString()+" ");
ac.setSelection((ac.getText().toString()).length());
}

});

到了這裡就基本完成了。