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
對應方法
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);