android 控件眾多 , 額 , 具體多少個呢? 貌似有那麼幾十個吧,也沒做個統計,嘿嘿!......
有木有朋友感覺寫了那麼長時間的android代碼,有時候想寫點自己的東西的時候卻發現自己好像離不開網絡耶,什麼都需要先到網絡上遨游一番才能解決自己的問題。思前想後,個人覺得還是有必要鞏固一下自己學習過的東西——想想以前這些東西,自己都寫過一遍了,但是折騰一段時間下來都不知道放哪裡去了........
好了,廢話不多說了,這次准備重新學習一下android的常用控件TextView、EditText、AutoCompleteTextView、Button、CalendarView、CheckBox、Chronometer、CompoundButton、DatePicker、DigitalClock、ExpandableListView、Gallery、GridView、HorizontalScrollView、ImageButton、ImageSwitcher、ImageView、ListPopupWindow、ListView、MultiAutoCompleteTextView、NumberPicker、PopupMenu、PopupWindow、ProgressBar、QuickContactBadge、RadioButton、RadioGroup、RatingBar、RemoteViews、ScrollView、SearchView、SeekBar、SlidingDarwer、Switch、TableHost、TextClock、TextSwitcher、TimePicker、Toast、ToggleButton、VideoView、ViewFlipper、ViewSwitcher、ZoomButton等控件。
今天學習的控件——AutoCompleteTextView , AutoCompleteTextView控件的作用是什麼呢? AutoComplete(自動完成),這裡大家叫他自動補全—— 當在EditText中輸入字符時他將去去一個集合中搜索出滿足條件的項,然後列出這些項。在官方文檔裡給的例子是這樣的
[java]
public class CountriesActivity extends Activity {
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.countries);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line, COUNTRIES);
AutoCompleteTextView textView = (AutoCompleteTextView)
findViewById(R.id.countries_list);
textView.setAdapter(adapter);
}
private static final String[] COUNTRIES = new String[] {
"Belgium", "France", "Italy", "Germany", "Spain"
};
}
好吧,今天就按照這個樣例簡單實現AutoCompleteTextView,只不過我們要將這裡的COUNTIES 換成我們自己想要的內容——在這裡我們關心的是整個系統中的文件名稱。
先看看效果圖:
下面就一步一步來實現上述功能
1、准備必須的布局文件——auto_complete_textview_detail.xml
[html]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<AutoCompleteTextView
android:id="@+id/show_auto_complete_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<requestFocus />
</AutoCompleteTextView>
</LinearLayout>
該文件中只包含一個View ——AutoCompleteTextView 。
2、 創建activity ——WidgetAutoCompleteActivity.java
[java]
package com.xy.zt.selfdefinewieget;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
public class WidgetAutoCompleteActivity extends Activity {
private AutoCompleteTextView mShowAuto;
private ArrayAdapter<String> mAutoAdapter;
private class FileSearchTask extends AsyncTask<Void, Void, String[]> {
@Override
protected void onPostExecute(String[] result) {
if (result == null || result.length == 0) {
return;
}
mShowAuto.setEnabled(true);
if (mAutoAdapter == null) {
mAutoAdapter = new ArrayAdapter<String>(
WidgetAutoCompleteActivity.this,
android.R.layout.simple_dropdown_item_1line, result);
mShowAuto.setAdapter(mAutoAdapter);
}
}
@Override
protected String[] doInBackground(Void... params) {
File rootDir = Environment.getRootDirectory();
LinkedList<File> queue = new LinkedList<File>();
ArrayList<String> result = new ArrayList<String>();
queue.offer(rootDir);
File tmpFile, tmpDirAllFile[];
while ((tmpFile = queue.poll()) != null) {
if (tmpFile.isDirectory()) {
tmpDirAllFile = tmpFile.listFiles();
if (tmpDirAllFile != null) {
for (File f : tmpDirAllFile) {
queue.offer(f);
}
}
} else {
result.add(tmpFile.getName());
}
}
String[] tmpFileNames = new String[result.size()];
result.toArray(tmpFileNames);
result.clear();
result = null;
queue = null;
return tmpFileNames;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.auto_complete_textview_detail);
init();
new FileSearchTask().execute();
}
private void init() {
mShowAuto = (AutoCompleteTextView) findViewById(R.id.show_auto_complete_textview);
mShowAuto.setEnabled(false);
mShowAuto.setThreshold(1);
}
}
這個文件處理了所有想要做的事,在OnCreate函數中 new FileSearchTask().execute(); 啟動一個異步線程在後台例舉出所有的文件名稱(在這個過程中AutoCompleteTextView是不可用的),加載完成後准備Adapter
[java]
mAutoAdapter = new ArrayAdapter<String>(
WidgetAutoCompleteActivity.this,
android.R.layout.simple_dropdown_item_1line, result);
mShowAuto.setAdapter(mAutoAdapter);
由於AutoCompleteTextView默認是最少兩個字符才進行處理, 想要輸入一個字符就進行處理——加入下面這句話
[java]
mShowAuto.setThreshold(1);
3、重點已經完成,下面就添加剩余的代碼以符合整個工程的架構。
3.1 在ViewData中加入如下內容
[java]
public static final int AUTO_COMPLETE_TEXTVIEW_ID = EDIT_TEXT_ID +1 ;
public static final String AUTO_COMPLETE_TEXTVIEW_NAME = "AutoCompleteTextView";
private static final ViewData mAutoCompleteTextView = new ViewData(AUTO_COMPLETE_TEXTVIEW_NAME, AUTO_COMPLETE_TEXTVIEW_ID);
View_Datas.add(mAutoCompleteTextView);
3.2 在WidgetsAdapter的handleItemClicked 函數中添加如下內容:
[java]
case ViewData.AUTO_COMPLETE_TEXTVIEW_ID:
intent.setClass(mContext, WidgetAutoCompleteActivity.class);
mContext.startActivity(intent);
break;
不想太死板,我想要更炫的效果,ok 滿足你 ^_^!
首先修改上文中mAutoAdapter的構造
[java]
mAutoAdapter = new ArrayAdapter<String>(
WidgetAutoCompleteActivity.this,
R.layout.auto_complete_item, R.id.auto_item_file_name,result);
上面代碼中看到使用了布局文件auto_complete_item和其內部定義的一個id叫auto_item_file_name的View,下面是文件內容
[html]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/auto_item_file_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:background="@drawable/widget_button_drawable"
android:textColor="@color/auto_complete_font_color"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:textSize="16sp" />
</LinearLayout>
注意:該布局中的TextView是必須的不能換成其他的View , 否則將報ClassCastException。
TextView使用的背景Widget_button_drawable的定義參見一步一步學android控件(之三) —— Button 。TextView 使用的字體顏色是心添加的 ,定義在widget_color.xml文件中
[html]
<color name="auto_complete_font_color">#FFCC00</color>