有一个关于Spinner扩展的问题,问题是,怎么把弹出来的菜单自定义。当然,书上是没有告诉你的,它们压根就不知道那个和ArrayAdapter相关的两个layout关联到底是什么回事说清楚,就这么列了个代码就算了。
而自定义Spinner则是和这两个layout有关,ArrayAdapter中初始化的那个layout,是用来渲染spinner被选择的item的样式,而setDropDownResource这个layout,则是弹出框时用的item样式。也就是说,这个spinner使用了两个列表,只不过第一个列表只是显示了一行而已。
下面列个代码,大家仔细看就明白了。
01 |
<? xml version = "1.0" encoding = "utf-8" ?> |
03 |
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" |
04 |
android:layout_width = "fill_parent" |
05 |
android:layout_height = "fill_parent" |
06 |
android:padding = "10dip" > |
08 |
< ImageView android:id = "@+id/icon" |
09 |
android:src = "@drawable/tick" |
10 |
android:layout_marginRight = "10dip" |
11 |
android:layout_width = "wrap_content" |
12 |
android:layout_height = "wrap_content" |
13 |
android:visibility = "invisible" /> |
15 |
< TextView android:id = "@+id/label" |
16 |
android:layout_width = "wrap_content" |
17 |
android:layout_height = "wrap_content" |
18 |
android:layout_toRightOf = "@id/icon" |
19 |
android:textColor = "#000000" |
20 |
android:textSize = "22dip" /> |
01 |
public class CustomSpinnerActivity extends Activity
{ |
02 |
public Spinner
spinner; |
04 |
public void onCreate(Bundle
savedInstanceState) { |
05 |
super .onCreate(savedInstanceState); |
06 |
setContentView(R.layout.ch07_custom_spinner); |
08 |
Resources
res = getResources(); |
09 |
CharSequence[]
platforms = res.getTextArray(R.array.platforms); |
11 |
spinner
= (Spinner) findViewById(R.id.target); |
13 |
ArrayAdapter<charsequence>
adapter = new ArrayAdapter<charsequence>( this ,
android.R.layout.simple_spinner_item, platforms) { |
15 |
public View
getDropDownView( int position,
View convertView, ViewGroup parent) { |
16 |
View
view = getLayoutInflater().inflate(R.layout.ch07_custom_spinner_item, parent, false ); |
18 |
TextView
label = (TextView) view.findViewById(R.id.label); |
19 |
label.setText(getItem(position)); |
21 |
if (spinner.getSelectedItemPosition()
== position) { |
22 |
label.setTextColor(getResources().getColor(R.color.selected_fg)); |
23 |
view.setBackgroundColor(getResources().getColor(R.color.selected_bg)); |
24 |
view.findViewById(R.id.icon).setVisibility(View.VISIBLE); |
30 |
spinner.setAdapter(adapter); |
33 |
}</charsequence></charsequence> |
