1. 程式人生 > >Spinner下拉列表的學習心得

Spinner下拉列表的學習心得

在android專案的過程中,使用到下拉列表控制元件,以前不是很熟悉,現在趁此機會好好學習,總結一下spinner在activity和fragment中的用法,供大家一塊學習和自己日後的進步。
這裡寫圖片描述
Spinner元件一共有兩個,一個是本身的Spinner,一個是android.support.v7.widget.AppCompatSpinner,兩者的區別在於v7內的Spinner是相容低版本的,Spinner再高版本中才能使用的方法換了v7下的Spinner後可以一直相容到2.1 (v7相容到api7),初次之外兩者的使用沒有其他差別,推薦使用v7,保證效果在不同版本上都能顯示.
spinner控制元件的使用步驟主要是分為以下幾步:

  • 第一步:在對應的佈局檔案中新增spinner控制元件
<Spinner
            android:id="@+id/spinner_location"
            android:layout_width="wrap_content"
            android:layout_height="35dp"/>

在佈局檔案中,寬度和高度可以根據自己的要求隨意調整,下面還有佈局檔案中對於spinner元件中的相關屬性。
a、 android:dropDownHorizontalOffset——spinnerMode=”dropdown”時,下拉的專案選擇視窗在垂直方向相對於Spinner視窗的偏移量
對應的方法:

setDropDownVerticalOffset(int)

這個屬性它必須是一個帶有單位的浮點型尺寸值,如:”14.5sp”。有效的單位包括:px(畫素)、dp(密度無關的畫素)、sp(基於引用字型的尺寸來縮放的畫素)、in(英寸)、mm(毫米)。
還可以引用一個資源(格式:@[package:]type:name)或者是包含這種型別值的主題屬性(格式:?[package][type:]name)。
b、android:dropDownSelector——-用於設定spinnerMode=”dropdown”時列表選擇器的顯示效果,它可以用”@[+][package]:type:name”格式來引用另外的資源,或者是用”?[package:][type:]name”的格式來 應用主題屬性,還可以是”#rgb”、”#argb”、”#rrggbb”、”aarrggbb”格式的顏色值。它對應的全域性屬性資源符號是dropDownSelector
c、android:dropDownWidth

—–在spinnerMode=”dropdown”時,設定下拉框的寬度。這個屬性可以是帶有單位的浮點型的尺寸值,如:14.5sp。有效的單位包括:px(畫素)、dp(密度無關的畫素)、sp(基於引用字型的尺寸來縮放的畫素)、in(英寸)、mm(毫米)。還可以引用一個資源(格式:@[package:]type:name)或者是包含這種型別值的主題屬性(格式:?[package][type:]name)。
對應方法

setDropDownWidth(int)

還可以是下列常量之一:
fill_parent = -1,下拉框的寬度應該使用螢幕的寬度來設定。這個常量從API Level 8開始被廢棄了,並且使用mach_parent常量來代替。
mach_parent = -1,下拉框的寬度應該使用螢幕的寬度來設定。在API Level 8中被引入。
wrap_content = -2,下拉框的寬度應該跟它的內容相適應
d、android:gravity——
這個屬性用於設定當前選擇的專案的對齊方式。
它必須是以下常量值之一或組合(用”|”符號分離)。
top = 0x30:把選擇的物件放到它的容器的頂部,不改變它的尺寸。
bottom = 0x50:把選擇的物件放到它的容器的底部,不改變它的尺寸。
left = 0x03:把選擇的物件放到它的容器的左邊,不改變它的尺寸。
right = 0x05:把選擇的物件放到它的容器的右邊,不改變它的尺寸。
center_vertical = 0x10:把選擇的物件放到它的容器的垂直中心,不改變它的尺寸。
fill_vertical = 0x70:為了完全的填充它的容器,系統會根據需要來增加選擇物件的垂直尺寸。
center_horizontal = 0x01:把選擇的物件放到它的容器的水平中心,不改變它的尺寸。
fill_horizontal = 0x07:為了完全的填充它的容器,系統會根據需要來增加選擇物件的水平尺寸。
center = 0x11:把選擇的物件放到它的容器的垂直和水平中心,不改變它的尺寸。
fill = 0x77:為了完全的填充它的容器,系統會根據需要來增加選擇物件的水平和垂直尺寸。
clip_vertical = 0x80:附加的可選設定,它可以設定容器內子物件的上下邊緣裁剪它的容器邊框。裁剪會基於垂直對齊的方式:頂部對齊的會裁剪底部邊緣,底部對齊的會裁剪頂部邊緣,不會上下邊緣都裁剪。
clip_horizontal = 0x08:附加的可選設定,它可以設定容器內子物件的左右邊緣裁剪它的容器邊框。裁剪會基於水平對齊的方式:左對齊的會裁剪右邊緣,右對齊的會裁剪左邊緣,不會左右邊緣都裁剪。
start = 0x00800003:把物件放到它的容器的開始位置,不改變它的尺寸。
end = 0x00800005:把物件放到它的容器的結束位置,不改變它的尺寸。
對應的全域性屬性資源符號是gravity。
注:Spinner物件是一個視窗物件容器,設定它的gravity屬性時,只會改變容器內部子視窗物件的對齊方式,並不會改變子視窗內部內容的對齊方式
對應方法

setGravity(int)

e、android:popupBackground——-
在spinner=”dropdown”時,使用這個屬性來設定下拉列表的背景。
可以使用”@[+][package:]type:name”格式來引用另外的資源,或者使用”?[package:][type:]name”格式來應 用主題屬性,也可以使用”#rgb”、”#argb”、”#rrggbb”、”#aarrggbb”格式的顏色值
f、android:prompt——-當顯示模式為dialog時生效,作用為顯示dialog的標題內容
g、android:spinnerMode ——-顯示模式 :popu和dialog兩種
第二步、設定資料來源和顯示主題
下拉列表的android.R系統自帶的xml樣式,其中常見的有android.R.layout.simple_spinner_item,android.R.pinner_dropdown,詳細可見(http://blog.csdn.net/a2012s/article/details/8372725),下面是具體的實現程式碼:

private Spinner spinner;
 private List<String>list;
  protected void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);
        MyApplication.getInstance().addActivity(this);
        list=new ArrayList<>();
        list.add("北京");
        list.add("上海");
        list.add("深圳");
        list.add("成都");
         location=(EditText)view.findViewById(R.id.location);
        spinner=(Spinner)view.findViewById(R.id.spinner_location);//繫結控制元件
         //選取合適的介面卡的樣式
        ArrayAdapter<String>adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,list);
        adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
        spinner.setAdapter(adapter);//新增介面卡
        //新增介面卡選擇動作
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
            {
                //下拉列表中的事件選中後反應
                location.setText("1");
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            //未選中事件響應
            }
        });

} 

第三步、新增介面卡,並新增響應事件
Spinner資料來源於xml陣列,其實用的最多的還是通過adapter來跟Spinner繫結資料,現階段一般使用已有的的介面卡,如ArrayAdapter,使用方法為、ArrayAdapter<String>adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,list);
,第二個引數是Spinner未展開選單時Spinner的預設樣式,android.R.layout.simple_spinner_item是系統自帶的內建佈局,響應事件主要是利用setOnItemSelectedListener,切忌不可弄錯,當時專案的過程中就因為粗心選錯了導致直接報錯;另一種是使用自定義的介面卡,下面是來自網上的自寫介面卡:

/**
 * 自定義介面卡類
 *  <a href=http://blog.csdn.net/jiangqq781931404></a>
 **/
public class MyAdapter extends BaseAdapter {

    private List<Person> mList;

    private Context mContext;
    public MyAdapter(Context pContext, List<Person> pList) {
        this.mContext = pContext;
        this.mList = pList;
    }
    @Override
    public int getCount() {
        return mList.size();
    }
    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    /**
     * 下面是重要程式碼
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater _LayoutInflater=LayoutInflater.from(mContext);
        convertView=_LayoutInflater.inflate(R.layout.item_custom, null);
        if(convertView!=null) {
            ImageView imageView = (ImageView)convertView.findViewById(R.id.image);
            imageView.setImageResource(R.drawable.ic_launcher);
            TextView _TextView1=(TextView)convertView.findViewById(R.id.textView1);
            TextView _TextView2=(TextView)convertView.findViewById(R.id.textView2);
            _TextView1.setText(mList.get(position).getPersonName());
            _TextView2.setText(mList.get(position).getPersonAddress());

        }

        return convertView;

    }

}

PS:在fragment中使用spinner控制元件的方法
第一種,主要在於第一個引數使用getActivity() ArrayAdapter<String>adapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_dropdown_item,mac_address);
第二種,其中第二個引數是values/arrays.xml檔案,主要是對於下列列表中的元素

<code class=" hljs xml"><!--?xml version="1.0" encoding="utf-8"?-->
<resources>    
<string-array name="options_array">       
 <item>星期一</item>        
<item>星期三</item>        
<item>星期四</item>        
<item>星期五</item>       
 <item>星期六</item>        
</string-array></resources>
</code>

下面是呼叫方法:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.options_array,android.R.layout.simple_spinner_item);