Android輸入控件是一種用於人機交互的元件,Android爲此提供了各類各樣的輸入控件,例如:按鈕(Button),文本域(text fields),拖動條(seek bars),複選框(checkBos),縮放按鈕(zoom buttons),開關按鈕(togglebuttons),等等。html
爲UI添加輸入控件,只須要在對應的佈局文件(XML Layout)添加對應的控件節點。以下,是一個包含編輯框和按鈕的佈局文件:java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:orientation=
"horizontal"
>
<EditText android:id=
"@+id/edit_message"
android:layout_weight=
"1"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:hint=
"@string/edit_message"
/>
<Button android:id=
"@+id/button_send"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@string/button_send"
android:onClick=
"sendMessage"
/>
</LinearLayout>
|
每一個輸⼊控件都支持⼀個特定的輸⼊事件,如當用戶輸⼊文本或觸摸⼀個按鈕,這樣你就能夠執行一個動做(處理事件)。android
下表列出了在App經常使用的輸入元件,若要了解更爲詳細的信息,看參閱官方文檔。數據庫
控件類型數組 |
描述app |
相關類less |
Buttonide |
按鈕,能夠被用戶按下或點擊,以執行⼀個動做佈局 |
Buttonpost |
可編輯的文本區域,可使用 |
||
複選框,⼀個能夠由用戶切換的ON/OFF開關。當提供給用戶⼀組不互斥的可選項時,你應該使用複選框 |
||
單選按鈕,與CheckBox類型,只是一組裏只能選擇一個選項 |
||
切換按鈕,帶有亮度顯示的 ON/OFF 按鈕 |
||
下拉列表,讓用戶從一系列的值中選擇一個值 |
||
選擇器,一個經過使用向上/向下按鈕或手勢從⼀系列值中選擇⼀個值的對話框。用DatePicker輸⼊日期(月,日,年)或用TimePicker輸⼊時間(⼩時,分鐘,上午/下午),這將被自動的格式化爲用戶區域的值(本地化)。 |
tips: 除了以上輸入控件,Android還有不少未列出來的控件,能夠瀏覽android.widget包去了解更多的控件信息。若是您的應用程序須要特定的輸⼊控件,你能夠自定義該組件。
在Android裏,Button能夠有一下三種顯示(純文本,圖片,或者文本+圖片)。
根據給出來的三種形式,你能夠在佈局文件中經過如下三種方法建立一個Button。
純文本組成,使用Button節點
1
2
3
4
5
6
|
<
Button
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:text
=
"@string/button_text"
...
/>
|
由圖片組成,使用ImageButton 節點(須要把相應的圖片添加到drawable文件夾裏)
1
2
3
4
5
|
<ImageButton
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@drawable/button_icon"
... />
|
文本+圖片,使用Button節點和android:drawableLeft
屬性
1
2
3
4
5
6
|
<Button
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@string/button_text"
android:drawableLeft=
"@drawable/button_icon"
... />
|
tips:還有drawableRight,drawableTop,drawableBottom,drawablePadding等等
響應Button的點擊事件,大概能夠分爲如下兩種方式:
1、在java代碼裏添加事件監聽器:
1
2
3
4
5
6
|
Button button = (Button) findViewById(R.id.button_send);
button.setOnClickListener(
new
View.OnClickListener() {
public
void
onClick(View v) {
// 響應按鈕點擊事件
}
});
|
2、在佈局文件裏定義Button的行爲屬性onClick,以下所示:
1
2
3
4
5
6
7
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
Button
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:id
=
"@+id/button_send"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:text
=
"@string/button_send"
android:onClick
=
"sendMessage"
/>
|
這樣,在點擊Button時,便會調用Activity裏的sendMessage()方法處理事件。
在Activity裏實現對應的事件處理方法sendMessage
1
2
3
4
|
/** 點擊Button時調用*/
publicvoid sendMessage(View view){
// 處理邏輯
}
|
使用這種xml的定義方式,有如下幾點是須要注意的:
(1)在佈局文件裏onClick屬性的值(onClick_event)必須與Activity裏方法名(onClick_event)一致(在這指sendMessage的一致)
(2)方法onClick_event返回值必須爲void,且爲public方法
(3)onClick_event只能一個參數View,View指事件源(Button)
tips:在沒有特別要求的狀況下,能夠選擇其中一種來響應Button的點擊事件。若是須要初始化Button控件或者在Fragment定義Button的響應方法,選擇使用第一種方式。
不一樣版本的Android系統或者說由不一樣廠家生產的Android手機,其Button的默認顯示樣式都會有所不一樣。若是須要控制Button在各類版本顯示一致的樣式,能夠選擇定義App的主題樣式。如:在Android4..0或者更高的版本中,能夠定義Holo的主題樣式——在manifest.xml的<application>節點添加屬性(低版本的系統須要添加對應支持包)
android:theme="@android:style/Theme.Holo"
相似的,能夠經過在佈局文件裏<Button>節點添加屬性android:background來定義
Button
的背景,其背景能夠是一張圖片或者是某種特定額顏色。
android:background="@drawable/button_icon"
無框
Button
偶爾,也許你會使用到無框按鈕,能夠經過在佈局文件的<Button>節點添加borderlessButtonStyle來定義無框按鈕
1
2
3
4
5
6
7
|
<Button
android:id=
"@+id/button_send"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@string/button_send"
android:onClick=
"sendMessage"
style=
"?android:attr/borderlessButtonStyle"
/>
|
有時候爲了炫酷的外觀和用戶體驗的須要,須要從新定義Button的背景和形狀(並非簡簡單單地添加一張圖片或者改變背景顏色)。那又是如何去美化Button默認的顯示樣式:
Demo1:使用位圖來改變Button三種狀態的樣式(default—默認樣式,pressed—被點擊時樣式,focused—得到焦點時的樣式)
第一步:選好或者製做好Button各類狀態下的背景圖片。須要注意的是,製做的圖片要適應不一樣大小的Button,能夠選擇製成nine-patch位圖。
第二步:將作好的圖片放到目錄res/drawable/下,併爲圖片統一命名,如button_default.9.png
,button_pressed.9.png
,,button_focused.9.png
.
第三步:在res/drawable/下建立xml文件(button_custom.xml),以下:
1
2
3
4
5
6
7
8
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
selector
xmlns:android
=
"http://schemas.android.com/apk/res/android"
>
<
item
android:drawable
=
"@drawable/button_pressed"
android:state_pressed
=
"true"
/>
<
item
android:drawable
=
"@drawable/button_focused"
android:state_focused
=
"true"
/>
<
item
android:drawable
=
"@drawable/button_default"
/>
</
selector
>
|
如此,即可爲Button指定各類狀態下的背景圖片。
第四步:在佈局文件裏建立Button按鈕,添加background屬性(其值爲@drawable/button_custom)
1
2
3
4
5
6
7
|
<
Button
android:id
=
"@+id/button_send"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:text
=
"@string/button_send"
android:onClick
=
"sendMessage"
android:background
=
"@drawable/button_custom"
/>
|
注意:在button_custom.xml文件裏,<item>有着順序之分的,android會自上往下去搜索第一個知足條件的<item>,搜到就中止往下搜索。因此默認的顯示圖片須要放在最後一個。
文本域組件中,EditText就是咱們經常使用的一個組件。 EditText是一個很是重要的組件,能夠說它是用戶和App進行數據傳輸窗戶,有了它就等於有了一扇和App傳輸的門,經過它用戶能夠把數據傳給App,而後獲得咱們想要的數據。EditText是TextView的子類,因此TextView的方法和特性一樣存在於EditText中,有興趣的能夠參閱官方文檔瞭解TextView的特性。
文本域裏能夠輸入不一樣類型的信息,如數字、密碼、email等等,在輸入時,系統會根據輸入類型來決定彈出哪種虛擬鍵盤。那呀如何來肯定文本域的輸入類型呢??
在節點EditText裏經過添加屬性android:inputTyp
e
來控制文本域的輸入類型,如一個輸入email的文本域,能夠這樣定義:
1
2
3
4
5
6
|
<
EditText
android:id
=
"@+id/email_address"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:hint
=
"@string/email_hint"
android:inputType
=
"textEmailAddress"
/>
|
對應彈出的鍵盤以下:
經常使用inputType有如下幾種:
「text」:常規文本鍵盤
「textEmailAddress」:帶有‘@’符號的常規文本鍵盤
「textUrl」:帶有‘/’的常規文本鍵盤
「number」:數字鍵盤
「phone」:撥號鍵盤
數字鍵盤
常規文本鍵盤
經過屬性android:inputTyp一樣能夠定製特定的鍵盤行爲,如使首字母大寫,使用拼寫建議等等。
屬性android:inputType是經過按位組合獲得值的,因此你能夠一次性定製一個或多個值(使用「|」隔開)。
下面給出屬性android:inputType經常使用的值:
"textCapSentences"常規文本鍵盤,句子首字母大寫
"textCapWords" 常規文本鍵盤,全部單詞首字母大寫。(適合用來輸入標題和人名)
"textAutoCorrect" 常規文本鍵盤,會糾正單詞拼寫錯誤
"textPassword" 數字鍵盤,以原點顯示輸入的數據
"textMultiLine" 常規文本鍵盤,容許用戶輸入多行文本
以下:定義了一個單詞首字母大寫,沒有拼寫建議的鍵盤
Demo:
1
2
3
4
5
6
|
<
EditText
android:id
=
"@+id/postal_address"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:hint
=
"@string/postal_address_hint"
android:inputType
=
"textCapWords|textNoSuggestions"
/>
|
除了能夠控制鍵盤的輸入類型,咱們同樣能夠去定製指定鍵(「回車鍵」)的Action。例如讓「回車鍵」具備「發送」或者「搜索」的功能。
能夠經過屬性android:imeOptions
來設置此Action,以下,使「回車鍵」具備「發送」的功能。
1
2
3
4
5
6
7
|
<
EditText
android:id
=
"@+id/search"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:hint
=
"@string/search_hint"
android:inputType
=
"text"
android:imeOptions
=
"actionSend"
/>
|
附:若是沒有顯式指定屬性android:imeOptions
的值,系統會自動日後搜索是否有能夠得到焦點的組件,若是存在這樣的組件,此時的「回車鍵」會顯示爲「Next」(actionNext);若是沒有則顯示爲「Done」(actionDone)。
若是經過android:imeOptions
定製了「回車鍵」的Action(例如上文的「actionSend」),你須要使用TextView.OnEditorActionListener監聽它的Action。監聽器TextView.OnEditorActionListener.裏有一個回調方法onEditorAction(),當中參數actionId用來識別哪種Action,如IME_ACTION_SEND和IME_ACTION_SEARCH.。
Demo:監聽是否按下了「Send」(actionSend)按鈕。
1
2
3
4
5
6
7
8
9
10
11
12
|
EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(
new
OnEditorActionListener() {
@Override
public
boolean
onEditorAction(TextView v,
int
actionId, KeyEvent event) {
boolean
handled =
false
;
if
(actionId == EditorInfo.IME_ACTION_SEND) {
sendMessage();
handled =
true
;
}
return
handled;
}
});
|
若是屏幕夠大(如橫屏的時候),你能夠在EditText旁自定義一個按鈕(用來實現某種邏輯),經過屬性android:imeActionLabel
來設置
1
2
3
4
5
6
7
|
<
EditText
android:id
=
"@+id/launch_codes"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:hint
=
"@string/enter_launch_codes"
android:inputType
=
"number"
android:imeActionLabel
=
"@string/launch"
/>
|
使用EditText的子類AutoCompleteTextView,能夠建立帶有提示文的文本域。根據提示文的來源不一樣(數據庫或數組),AutoCompleteTextView提供了不一樣的適配器。
以下,演示如何使用
ArrayAdapter(數組適配器)來建立
AutoCompleteTextView。
第一步:在佈局文件裏添加節點AutoCompleteTextView
1
2
3
4
|
<
AutoCompleteTextView
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:id
=
"@+id/autocomplete_country"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
/>
|
第二步:在strings.xml定義提示文數組,這裏以輸入國家名爲列,給出各個國家名的提示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
resources
>
<
string-array
name
=
"countries_array"
>
<
item
>Afghanistan</
item
>
<
item
>Albania</
item
>
<
item
>Algeria</
item
>
<
item
>American Samoa</
item
>
<
item
>Andorra</
item
>
<
item
>Angola</
item
>
<
item
>Anguilla</
item
>
<
item
>Antarctica</
item
>
...
<
item
>China</
item
>
...
</
string-array
>
</
resources
>
|
第三步:在Activity或Fragment裏爲AutoCompleteTextView設置適配器:
1
2
3
4
5
6
7
|
// 得到AutoCompleteTextView組件
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country);
// 從strings.xml得到國家名稱的數組
String[] countries = getResources().getStringArray(R.array.countries_array);
// 建立適配器,並用setAdapter()爲AutoCompleteTextView設置此適配器
ArrayAdapter<String> adapter =
new
ArrayAdapter<String>(
this
, android.R.layout.simple_list_item_1, countries);
textView.setAdapter(adapter);
|
在這裏,ArrayAdapter綁定了國家名稱的數組countries,並以TextView的形式和simple_list_item_1的佈局顯示。佈局simple_list_item_1是Android系統爲列表信息的顯示提供的一種標準外觀。
效果如圖:
附:在這裏只是爲演示功能的使用,全部並無設置全部的國家名稱提示文,(可根據App的實際須要來設置提示文)
CheckBos(複選框)的主要功能就是完成複選框額操做,在用戶輸入信息時,能夠一次性選擇多個內容。例如,用戶在選擇我的興趣愛好時,或者用戶在設置系統的功能時,這樣選項必定會存在一個或多個,則此時能夠直接使用CheckBox完成此功能。
往佈局文件裏的<CheckBox>節點添加屬性android:onClick,其值爲調用的方法名(與上文Button用法相似)。
Demo:
在佈局文件定義兩個CheckBox
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?
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"
>
<
CheckBox
android:id
=
"@+id/checkbox_meat"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:text
=
"@string/meat"
android:onClick
=
"onCheckboxClicked"
/>
<
CheckBox
android:id
=
"@+id/checkbox_cheese"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:text
=
"@string/cheese"
android:onClick
=
"onCheckboxClicked"
/>
</
LinearLayout
>
|
在Activity裏實現對應的事件處理方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public
void
onCheckboxClicked(View view) {
// 得到checkBox的選中狀態(選中或不選)
boolean
checked = ((CheckBox) view).isChecked();
switch
(view.getId()) {
//經過Id得到改變了狀態的CheckBox
case
R.id.checkbox_meat:
if
(checked)
// 選中狀態下的邏輯
else
// 沒有選中狀態下的邏輯
break
;
case
R.id.checkbox_cheese:
if
(checked)
//選中狀態下的邏輯
else
//沒有選中狀態下的邏輯
break
;
// ...
}
}
|
使用這種xml設置響應方式的定義方式,有如下幾點是須要注意的:
(1)在佈局文件裏onClick屬性的值(onClick_event)必須與Activity裏方法名(onClick_event)一致(在這指onCheckboxClicked的一致)
(2)方法onClick_event返回值必須爲void,且爲public方法
(3)onClick_event只能一個參數View,View指事件源(CheckBox)
一樣地,能夠在java代碼裏添加監聽器(CompoundButton.OnCheckedChangeListener):
1
2
3
4
5
6
7
8
9
10
11
12
|
meat = (CheckBox) findViewById(R.id.checkbox_meat);
// 給CheckBox設置事件監聽
meat.setOnCheckedChangeListener(
new
CompoundButton.OnCheckedChangeListener() {
@Override
public
void
onCheckedChanged(CompoundButton buttonView,
boolean
isChecked) {
if
(isChecked) {
// 選中狀態下的邏輯
}
else
{
// 沒有選中狀態下的邏輯
}
}
});
|
tips:能夠用setchecked(boolean)或 toggle()方法來設置checkbox的選中狀態。
RadioButton(單選按鈕)提供了一種多選一的操做模式(添加到RadioGroup裏),例如從性別「男」或「女」中選擇一個。
Demo:
在佈局文件裏定義RadioGroup和RadioButton,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<RadioGroup xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
>
<RadioButton android:id=
"@+id/radio_pirates"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@string/pirates"
android:onClick=
"onRadioButtonClicked"
/>
<RadioButton android:id=
"@+id/radio_ninjas"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@string/ninjas"
android:onClick=
"onRadioButtonClicked"
/>
</RadioGroup>
|
附:RadioGroup是LinearLayout的一個子類,其orientation默認爲vertical。
在Activity裏實現對應的事件處理方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
void
onRadioButtonClicked(View view) {
// 得到RadioButton的選中狀態(選仍是沒選)
boolean
checked = ((RadioButton) view).isChecked();
switch
(view.getId()) {
//經過Id得到改變了狀態的CheckBox
case
R.id.radio_pirates:
if
(checked)
// 選中了R.id.radio_pirates
break
;
case
R.id.radio_ninjas:
if
(checked)
// 選中了R.id.radio_ninjas
break
;
}
}
|
使用這種xml設置響應方式的定義方式,有如下幾點是須要注意的:
(1)在佈局文件裏onClick屬性的值(onClick_event)必須與Activity裏方法名(onClick_event)一致(在這指onRadioButtonClicked的一致)
(2)方法onClick_event返回值必須爲void,且爲public方法
(3)onClick_event只能一個參數View,View指事件源(RadioButton)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// 經過findViewById得到RadioGroup對象
raGroup = (RadioGroup) findViewById(R.id.radioGroup);
// 添加事件監聽器
raGroup.setOnCheckedChangeListener(
new
RadioGroup.OnCheckedChangeListener() {
@Override
public
void
onCheckedChanged(RadioGroup group,
int
checkedId) {
if
(checkedId == R.id.radio_pirates) {
// 選中R.id. radio_pirates的邏輯
}
else
if
(checkedId == R.id.radio_ninjas) {
// 選中R.id.radio_ninjas的邏輯
}
else
{
// 其餘邏輯
}
}
});
|
ToggleButton(開關按鈕)是讓用戶(對某功能)在on/off下選擇,並能夠不一樣的狀態on/off設置不一樣的顯示文本。在Android 4.0(API 14)以後,提供了另一種表現形式Switches,以下所示:
ToggleButton 和 Switch 都是CompoundButton
的子類,因此能夠選擇相似的方式來使用ToggleButton或 Switch。
設置ToggleButtons的響應方式
在佈局文件<ToggleButton>或<Switch>節點添加屬性android:onClick
.
1
2
3
4
5
6
7
|
<
ToggleButton
android:id
=
"@+id/togglebutton"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:textOn
=
"on"
android:textOff
=
"off"
android:onClick
=
"onToggleClicked"
/>
|
附:屬性textOn和textOff用來設置ToggleButton on/off狀態下顯示的文本,在Android4.0或更高的版本,可使用<Switch>來代替<ToggleButton>
在Activity裏實現對應的事件處理方法:
1
2
3
4
5
6
7
8
9
10
|
public
void
onToggleClicked (View view) {
// 判斷是否處在「on」狀態下
boolean
on = ((ToggleButton) view).isChecked();
if
(on) {
// on 狀態下的邏輯
}
else
{
// off 狀態下的邏輯
}
}
|
使用這種xml設置響應方式的定義方式,有如下幾點是須要注意的:
(1)在佈局文件裏onClick屬性的值(onClick_event)必須與Activity裏方法名(onClick_event)一致(在這指onToggleClicked的一致)
(2)方法onClick_event返回值必須爲void,且爲public方法
(3)onClick_event只能一個參數View,View指事件源(ToggleButton)
一樣地,能夠在java代碼裏添加監聽器(CompoundButton.OnCheckedChangeListener),實現方法與上文相似
1
2
3
4
5
6
7
8
9
10
|
ToggleButton toggle = (ToggleButton) findViewById(R.id.togglebutton);
toggle.setOnCheckedChangeListener(
new
CompoundButton.OnCheckedChangeListener() {
public
void
onCheckedChanged(CompoundButton buttonView,
boolean
isChecked) {
if
(isChecked) {
// on 狀態下的邏輯
}
else
{
// off狀態下的邏輯
}
}
});
|
Spinner(下拉列表),以列表的形式供用戶去選擇,與CheckBox(複選框)或RadioButton(單選按鈕)相比,Spinner能夠節省手機的屏幕空間。
Demo:
在佈局文件裏定義一個下拉列表:
1
2
3
4
|
<
Spinner
android:id
=
"@+id/planets_spinner"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
/>
|
在佈局文件定義了<Spinner>節點以後,接着須要設置其顯示的列表項,根據列表項數據來源的不一樣,能夠建立不一樣的適配器(相似於AutoCompleteTextView的實現)。比較經常使用的有ArrayAdapter適配器,下面演示一下其用法(以八大恆星爲例)
第一步:在strings.xml添加數組plantts_array
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
resources
>
<
string-arrayname
=
"planets_array"
>
<
item
>水星</
item
>
<
item
>金星</
item
>
<
item
>地球</
item
>
<
item
>火星</
item
>
<
item
>木星</
item
>
<
item
>土星</
item
>
<
item
>天王星</
item
>
<
item
>海王星</
item
>
</
string-array
>
</
resources
>
|
第二步:在Activity或 Fragment裏設置Spinner的適配器:
1
2
3
4
5
6
7
|
Spinner spinner =(Spinner) findViewById(R.id.spinner);
// 使用默認的下拉列表佈局和數組plants_array來建立數組適配器ArrayAdapter
ArrayAdapter<CharSequence> adapter =ArrayAdapter.createFromResource(
this
,R.array.planets_array, android.R.layout.simple_spinner_item);
// 指定所彈出的下拉列表的佈局方式
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// 爲spinner設置適配器
spinner.setAdapter(adapter);
|
附:simple_spinner_item 和 simple_spinner_dropdown_item都是系統爲下拉列表提供的一種佈局方式。
有着另一種更加簡單配置方法,以下:
第一步與上面同樣,在strings.xml添加數組planets_array。
第二步:在<Spinner>節點添加屬性android:entries,其值指向planets_array數組
1
2
3
4
5
|
<
Spinner
android:id
=
"@+id/planets_spinner"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:entries
=
"@array/planets_array"
/>
|
其實現效果是同樣的。
監聽用戶的選擇,須要實現監聽器AdapterView.OnItemSelectedListener內的方法onItemSelected()
和onNothingSelected()
,以下給出了實現此監聽器的Activity。
1
2
3
4
5
6
7
8
9
10
|
public
class
SpinnerActivity
extends
Activity
implements
OnItemSelectedListener {
...
public
void
onItemSelected(AdapterView<?> parent, View view,
int
pos,
long
id) {
//可使用方法parent.getItemAtPosition(pos)得到用戶選擇的選項
}
public
void
onNothingSelected(AdapterView<?> parent) {
//用戶沒有選取任何選項時觸發此方法
}
}
|
接着經過setOnItemSelectedListener()
爲spinner設置監聽器,代碼以下:
1
2
|
Spinner spinner =(Spinner) findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(
this
);
|
附:一樣也可使用內部類的方式爲spinner設置監聽器,實現方式與前文提到的組件相似。
android 爲用戶提供裏一個選擇時間/日期的現成對話框,如圖。
Picker(選擇器)自動調整爲當地的語言環境,能夠確保你獲得一個遵循必定格式的時間(或者日期)。
推薦使用DialogFragment來管理時間和日期選擇器,由於DialogFragment會爲你管理這些選擇器的生命週期,且容許在不一樣的佈局配置裏顯示這些選擇器(如在小屏幕的手機上顯示爲基本的對話框,在大屏幕上則內嵌如到佈局裏去)。
附:從Android3.0開始纔開始支持DialogFragment,若是須要運行在低版本的手機上,能夠添加對應的支持包。
要使用DialogFragment來顯示TimePickerDialog,須要作到如下三點:
1、建立一個片斷類繼承TimePickerFragment繼承DialogFragment
2、在onCreateDialog()
裏返回TimePickerDialog的對象
3、實現TimePickerDialog.OnTimeSetListener
接口
以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
static
class
TimePickerFragment
extends
DialogFragment
implements
TimePickerDialog.OnTimeSetListener {
@Override
public
Dialog onCreateDialog(Bundle savedInstanceState) {
//用當前時間做爲picker的默認時間
final
Calendar c = Calendar.getInstance();
int
hour = c.get(Calendar.HOUR_OF_DAY);
int
minute = c.get(Calendar.MINUTE);
// 建立TimePickerDialog對象並返回該對象
return
new
TimePickerDialog(getActivity(),
this
, hour, minute,DateFormat.is24HourFormat(getActivity()));
}
public
void
onTimeSet(TimePicker view,
int
hourOfDay,
int
minute) {
//當用戶設置好(點擊「Set」按鈕)以後的邏輯
}
}
|
附:可參考API文檔瞭解各個參數的意義
設計好TimePickerFragment以後,須要作的就是,在Activity建立TimePickerFragment的對象並調用其show()方法便可
以下:定義了一個按鈕,點擊後便後彈出TimePickerDialog
1
2
3
4
5
|
<
Button
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:text
=
"@string/pick_time"
android:onClick
=
"showTimePickerDialog"
/>
|
Button對應的事件處理方法以下:
1
2
3
4
|
public
void
showTimePickerDialog(View v) {
DialogFragment newFragment =
new
TimePickerFragment();
newFragment.show(getSupportFragmentManager(),
"timePicker"
);
}
|
建立日期選擇器(Date Picker)
其方法與時間選擇器相似。
要使用DialogFragment來顯示DatePickerDialog,須要作到如下三點:
1、建立一個片斷類繼承DatePickerFragment繼承DialogFragment
2、在onCreateDialog()
裏返回DatePickerDialog的對象
3、實現DatePickerDialog.OnDateSetListener
接口
代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
static
class
DatePickerFragment
extends
DialogFragment
implements
DatePickerDialog.OnDateSetListener {
@Override
public
Dialog onCreateDialog(Bundle savedInstanceState) {
//使用當前日期做爲date picker 的默認顯示日期
final
Calendar c = Calendar.getInstance();
int
year = c.get(Calendar.YEAR);
int
month = c.get(Calendar.MONTH);
int
day = c.get(Calendar.DAY_OF_MONTH);
// 建立 DatePickerDialog 對象並返回給對象
return
new
DatePickerDialog(getActivity(),
this
, year, month, day);
}
public
void
onDateSet(DatePicker view,
int
year,
int
month,
int
day) {
//當用戶設置好(點擊「Set」按鈕)以後的邏輯
}
}
|
接着定義一個Button
1
2
3
4
5
|
<
Button
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:text
=
"@string/pick_date"
android:onClick
=
"showDatePickerDialog"
/>
|
最後在Activity裏實現對應的事件處理方法
1
2
3
4
|
public
void
showDatePickerDialog(View v) {
DialogFragment newFragment =
new
DatePickerFragment();
newFragment.show(getSupportFragmentManager(),
"datePicker"
);
}
|
本文出自 「靜心天涯」 博客,請務必保留此出處http://peiquan.blog.51cto.com/7518552/1283065