鍍金池/ 教程/ Android/ 第七章-下拉框Spinner控件
第十八章-ViewPager+FragmentStatePagerAdapter實(shí)現(xiàn)仿微信Tab
第十五章-GridView實(shí)現(xiàn)動(dòng)態(tài)添加和刪除子項(xiàng)
第九章-進(jìn)度條ProgressBar
第十二章-經(jīng)典的ListView
第十四章-GridView控件
第八章-時(shí)間相關(guān)控件
第七章-下拉框Spinner控件
第二章-EditText探秘
第二十章-Android菜單之上下文菜單
第十一章-各種對(duì)話框Dialog集錦
第二十一章-Android菜單之子菜單
第六章-切換類TextSwitcher和ImageSwitcher
第十七章-ViewPager切換界面
第五章-開關(guān)按鈕ToggleButton和Switch
第二十二章-PopupWindow浮動(dòng)窗
第十六章-幻燈片ViewFlipper
第二十四章-RecyclerView動(dòng)態(tài)添加、刪除及點(diǎn)擊事件
第三章-交互之王Button控件
第二十三章-全新控件RecyclerView
第一章-好玩的TextView
第十三章-ListView擴(kuò)展(多選、全選、反選)
第四章-玩轉(zhuǎn)單選和多選按鈕
第十章-可以拖動(dòng)的ProgressBar-SeekBar
第十九章-Android菜單之選項(xiàng)菜單

第七章-下拉框Spinner控件

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="這里寫圖片描述" />

  • 方式二 通過代碼進(jìn)行控制,這里以適配器形式設(shè)置數(shù)據(jù)源,并設(shè)置了下拉項(xiàng)選擇監(jiān)聽,選擇項(xiàng)目后會(huì)Toast選擇了哪一項(xiàng)。

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="這里寫圖片描述" />