聲明:學習的書籍《Android應用開發揭秘》,這裡記錄學習該書籍的日誌,引用的相關代碼與總結描述,沒有商業的用途,完全是自我學習的一個記錄,剛剛學習不可避免會出現很多問題,若是有錯誤還請大家多多批評。
一、多項選擇(CheckBox)
多項選擇與單項選擇實作類別似,都是需要監聽每個控制項。
二、下拉式清單(Spinner)
執行個體分析:該執行個體主要實現一個下拉式清單血型的選擇。
【關注點】
1. 可選內容如何與下拉式清單關聯。
本例子使用了ArrayAdapter<String>
2. Adapter的理解與應用
API: An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View for each item in the data set.
一個Adapter對象作為一個AdapterView和View底層資料之間的橋,提供對data Items的存取,同時負責針對每個Data如何渲染到對應的View中, 可以理解為MVC中的核心控制Controller。
執行個體關鍵源碼如下:
private static final String[]m_Countries= { "O型", "A型", "B型", "AB型", "其他" };private ArrayAdapter<String>adapter;m_Spinner = (Spinner) findViewById(R.id.Spinner1); //將可選內容與ArrayAdapter串連 adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, m_Countries); //設定下拉式清單的風格adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line); //將adapter添加到m_Spinner中 m_Spinner.setAdapter(adapter); //添加Spinner時間監聽 m_Spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){@Overridepublic void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {m_TextView.setText("你的血型是:" + m_Countries[arg2]);//設定顯示當前選擇的項arg0.setVisibility(View.VISIBLE);}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {} });
執行個體效果:
【擴充點】
1. AdapterView
Spinner是AdapterView的間接子類,
API:An AdapterView is a view whose children are determined by an Adapter.
作為一個View,其children通過一個Adapter來決定
關注具體的Adapter子類介面包括
android.widget.ListAdatper ,SpinnerAdapter 和WrapperListAdapter
抽象實作類別包括
android.widget.BaseAdapter,CursorAdapter ,ResourceCursorAdapter
常用的實作類別
android.widget.SimpleAdapter,
android.widget.ArrayAdapter
android.widget.SimpleCursorAdapter
HeaderViewListAdapter
2. ArrayAdatper
針對ArrayAdapter的模型可以為任意自訂的Object
/***
* Constructor
* @param context The current context.
* @param textViewResourceId The resource ID for a layout file containing a TextView to use when instantiating views.
* @param objects The objects to represent in the ListView.
*/
public ArrayAdapter(Context context, int textViewResourceId, List<T> objects) {
init(context, textViewResourceId, 0, objects);
}
比如:
String[] gameCategory = new String[] { fiveChess, numberChess, linkChess,
russiaBox };
GameType[] gameCategory2 = { new GameType(fiveChess, "五子棋"),
new GameType(numberChess, "九宮格"), new GameType(linkChess, "連連看"),
new GameType(russiaBox, "俄羅斯方塊") };
一個為String數組,一個為GameType數組
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, gameCategory);
ArrayAdapter<GameType> adapter = new ArrayAdapter<GameType>(this,android.R.layout.simple_spinner_item, gameCategory2);
針對不同的Adapter都可以綁定給Spinner
private Spinner gameTypeSP;
gameTypeSP.setAdapter(adapter);
該選擇對應的Spinner的選擇結果時,需要根據對應的物件類型擷取對應的值即可
Object gameTypeSelectItem = this.gameTypeSP.getSelectedItem();
if (gameTypeSelectItem instanceof GameType) {
if (gameTypeSelectItem != null) {
this.seletedGameType = ((GameType) gameTypeSelectItem).getGameKey();
} else {
Log.d("GameCategory onClick", "gameTypeSelectItem is null");
}
}
如果是String對象,直接如下
Object gameTypeSelectItem = this.gameTypeSP.getSelectedItem().toString();
需要關注的是,GameType的toString() 方法,需要返回期望的值
三、自動提示控制項(AutoCompleteTextView、MultiAutoCompleteTextView)
該控制項可以實現在使用者輸入資料時,動態查詢已輸入的內容,類似於google,百度的動態查詢效果。
執行個體關鍵源碼:
private static final String[]autoString= new String[] { "a2", "abf", "abe", "abcde", "abc2", "abcd3", "abcde2", "abc2", "abcd2", "abcde2" };/關聯關鍵字 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, autoString); AutoCompleteTextView m_AutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.AutoCompleteTextView01); //將adapter添加到AutoCompleteTextView中 m_AutoCompleteTextView.setAdapter(adapter); /////////////////// MultiAutoCompleteTextView mm_AutoCompleteTextView = (MultiAutoCompleteTextView) findViewById(R.id.MultiAutoCompleteTextView01); //將adapter添加到AutoCompleteTextView中 mm_AutoCompleteTextView.setAdapter(adapter); mm_AutoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
:
關於這兩個控制項AutoCompleteTextView、MultiAutoCompleteTextView的之間的具體區別,可以參考:
Android控制項之AutoCompleteTextView、MultiAutoCompleteTextView探究
四、 日期和時間(DatePicker和TimePicker)
這兩個控制項的使用還是比較簡單的,在main.xml布局檔案中定義之後,通過java.util.Calendar類獲得系統時間,然後通過init方法將日期傳遞給DatePicker,並設定OnDateChangedListener來監聽日期改變。
同樣時間改變需要設定setOnTimeChangedListener監聽器即可。
關鍵源碼:
Calendar c = Calendar.getInstance();//擷取DatePicker對象m_DatePicker = (DatePicker) findViewById(R.id.DatePicker01);//將日曆初始化為當前系統時間,並設定其事件監聽m_DatePicker.init(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() {@Overridepublic void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth){//當日期更改時,在這裡處理//c.set(year, monthOfYear, dayOfMonth);}});
學習到P79頁