Android程序運(yùn)行在手機(jī)上,手機(jī)屏幕存在著較大的尺寸局限,怎樣在有限的布局里顯示更多的內(nèi)容,下拉列表控件可以有效地解決這一問題,主要在信息較固定的場合使用,例如注冊(cè)信息時(shí)的性別選擇、省份選擇和出生日期選擇等等。首先看一下Spinner的結(jié)構(gòu):
public class
Spinner
extends AbsSpinner
implements DialogInterface.OnClickListener
java.lang.Object
? android.view.View
? android.view.ViewGroup
? android.widget.AdapterView<T extends android.widget.Adapter>
? android.widget.AbsSpinner
? android.widget.Spinner
從API文檔給出的繼承結(jié)構(gòu)來看,Spinner類繼承自AbsSpinner,實(shí)現(xiàn)了DialogInterface.OnClickListener 接口。Spinner常用屬性有:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/7-1.png" alt="這里寫圖片描述" />
常用方法有:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/7-2.png" alt="這里寫圖片描述" />
下拉列表框中的列表項(xiàng)有兩種配置方式,一種通過布局文件的entries屬性配置,一種在代碼中配置,首先介紹一下如何通過屬性進(jìn)行配置。
1.編寫數(shù)據(jù)源文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="months">
<item>一月</item>
<item>二月</item>
<item>三月</item>
</string-array>
</resources>
用string-array標(biāo)簽包裹,每一個(gè)item代表一個(gè)下拉列表項(xiàng)。
2.布局文件
<?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">
<Spinner
android:id="@+id/spinner"
android:entries="@array/months"
android:layout_width="wrap_content"
android:spinnerMode="dialog"
android:prompt="@string/month"
android:layout_height="wrap_content" />
</RelativeLayout>
布局文件的Spinner標(biāo)簽中添加了entries屬性,spinnerMode屬性選擇了對(duì)話框模式,并設(shè)置了其prompt屬性,運(yùn)行實(shí)例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/7-3.png" alt="這里寫圖片描述" />
1.布局文件:
<?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">
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
2.Activity程序:
public class MainActivity extends Activity {
private Spinner spinner;
ArrayAdapter <String> adapter;
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner=(Spinner)findViewById(R.id.spinner);
spinner.setPrompt("請(qǐng)選擇季節(jié)");
initDatas();
adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this,"您選擇的月份是:"+list.get(position),Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
private void initDatas() {
list=new ArrayList<String>();
list.add("春季");
list.add("夏季");
list.add("秋季");
list.add("冬季");
}
}
這里使用了ArrayAdapter適配器填充了數(shù)據(jù)源,ArrayAdapter初始化時(shí)需要傳入三個(gè)參數(shù),分別是上下文對(duì)象、顯示布局文件和數(shù)據(jù)源對(duì)象。初始化ArrayAdapter后,調(diào)用Spinner的setAdapter方法,設(shè)置數(shù)據(jù)源。調(diào)用了setPrompt方法設(shè)置提示信息,同時(shí)還設(shè)置了Spinner子項(xiàng)的選擇監(jiān)聽事件,通過覆寫方法中的position參數(shù),可以確定選擇的是哪一個(gè)子項(xiàng),通過Toast輸出選擇信息。
運(yùn)行項(xiàng)目實(shí)例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/7-4.png" alt="這里寫圖片描述" />
下拉級(jí)聯(lián)是我們?cè)陂_發(fā)中經(jīng)常會(huì)遇到的問題,下面結(jié)合單選選擇監(jiān)聽,動(dòng)態(tài)控制下級(jí)下拉框內(nèi)容的渲染,通過一個(gè)實(shí)例進(jìn)行說明如何實(shí)現(xiàn)這一需求。
1.布局文件:
<?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">
<Spinner
android:id="@+id/spinner_season"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Spinner
android:id="@+id/spinner_month"
android:layout_width="wrap_content"
android:prompt="@string/month"
android:layout_toRightOf="@+id/spinner_season"
android:layout_height="wrap_content" />
</RelativeLayout>
2.MainActivity 代碼:
public class MainActivity extends Activity {
private Spinner spinner_season,spinner_month;
ArrayAdapter <String> adapter_season,adapter_month;
private List<String> list_season;
String months[][]={{"一月","二月","三月"},{"四月","五月","六月"},{"七月","八月","九月"},{"十月","十一月","十二月"}};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner_season=(Spinner)findViewById(R.id.spinner_season);
spinner_month=(Spinner)findViewById(R.id.spinner_month);
spinner_season.setPrompt("請(qǐng)選擇季節(jié)");
initDatas();
adapter_season=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list_season);
spinner_season.setAdapter(adapter_season);
spinner_season.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
adapter_month=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,months[position]);//通過二維數(shù)組及position的值動(dòng)態(tài)決定下級(jí)菜單的數(shù)據(jù)源
adapter_month.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);//設(shè)置下拉顯示樣式
spinner_month.setAdapter(adapter_month);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
private void initDatas() {
list_season=new ArrayList<String>();
list_season.add("春季");
list_season.add("夏季");
list_season.add("秋季");
list_season.add("冬季");
}
}
這里定義了一個(gè)二維數(shù)組,在覆寫的onItemSelected方法中根據(jù)傳入的position的值動(dòng)態(tài)決定下級(jí)列表框的數(shù)據(jù)源,從而實(shí)現(xiàn)數(shù)據(jù)級(jí)聯(lián)的效果。這里還利用Spinner的setDropDownViewResource方法設(shè)置了下拉顯示樣式,參考下圖:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/7-5.png" alt="這里寫圖片描述" />