Android程序運行在手機上,手機屏幕存在著較大的尺寸局限,怎樣在有限的布局里顯示更多的內容,下拉列表控件可以有效地解決這一問題,主要在信息較固定的場合使用,例如注冊信息時的性別選擇、省份選擇和出生日期選擇等等。首先看一下Spinner的結構:
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文檔給出的繼承結構來看,Spinner類繼承自AbsSpinner,實現了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="這里寫圖片描述" />
下拉列表框中的列表項有兩種配置方式,一種通過布局文件的entries屬性配置,一種在代碼中配置,首先介紹一下如何通過屬性進行配置。
1.編寫數據源文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="months">
<item>一月</item>
<item>二月</item>
<item>三月</item>
</string-array>
</resources>
用string-array標簽包裹,每一個item代表一個下拉列表項。
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標簽中添加了entries屬性,spinnerMode屬性選擇了對話框模式,并設置了其prompt屬性,運行實例如下:
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("請選擇季節(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適配器填充了數據源,ArrayAdapter初始化時需要傳入三個參數,分別是上下文對象、顯示布局文件和數據源對象。初始化ArrayAdapter后,調用Spinner的setAdapter方法,設置數據源。調用了setPrompt方法設置提示信息,同時還設置了Spinner子項的選擇監(jiān)聽事件,通過覆寫方法中的position參數,可以確定選擇的是哪一個子項,通過Toast輸出選擇信息。
運行項目實例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/7-4.png" alt="這里寫圖片描述" />
下拉級聯是我們在開發(fā)中經常會遇到的問題,下面結合單選選擇監(jiān)聽,動態(tài)控制下級下拉框內容的渲染,通過一個實例進行說明如何實現這一需求。
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("請選擇季節(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]);//通過二維數組及position的值動態(tài)決定下級菜單的數據源
adapter_month.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);//設置下拉顯示樣式
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("冬季");
}
}
這里定義了一個二維數組,在覆寫的onItemSelected方法中根據傳入的position的值動態(tài)決定下級列表框的數據源,從而實現數據級聯的效果。這里還利用Spinner的setDropDownViewResource方法設置了下拉顯示樣式,參考下圖:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/7-5.png" alt="這里寫圖片描述" />