有一个关于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> |