一、以资源方式,静态展示 Spinner 选项
1.在资源文件 (strings.xml) 中,增加:
<stringname="spin_prompt">请选择城市</string>
<string-arrayname="cities">
<item>北京</item>
<item>上海</item>
<item>南京</item>
<item>乌鲁木齐</item>
<item>哈尔滨</item>
<item>符拉迪沃斯托克</item>
</string-array>
2.在布局文件 (main.xml) 中,增加:
<Spinner
android:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/cities"
android:prompt="@string/spin_prompt"
/>
注意: android:prompt 必须要引用 strings.xml 中资源 ID ,而不能在这里直接用 raw text 。
运行结果:
点击Spinner右边的带倒三角的按钮,即出现各城市选项如下:
二、以代码方式,动态展示 Spinner 选项
1.在资源文件 strings.xml 中,无需定义任何资源。
2.在布局文件 (main.xml) 中, Spinner 的描述为:
<Spinner
android:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
3.在 Activity 对应的代码中做相关修改,使之如下:
1 public class ControlSpinner extends Activity 2 { 3 private static final String tag = "ControlSpinner"; 4 private static final String[] cities = {"上海", "北京", "南京", "哈尔滨", "乌鲁木齐", "符拉迪沃斯托克", "圣弗朗西斯科"}; 5 6 private Spinner spinner ; 7 @Override 8 public void onCreate(Bundle savedInstanceState) 9 { 10 super .onCreate(savedInstanceState); 11 setContentView(R.layout.main); 12 13 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, cities); 14 15 //ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item); 16 //adapter.add("上海"); 17 //adapter.add("北京"); 18 //adapter.add("南京"); 19 //adapter.add("哈尔滨"); 20 //adapter.add("乌鲁木齐"); 21 //adapter.add("符拉迪沃斯托克"); 22 //adapter.add("圣弗朗西斯科"); 23 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 24 25 spinner = (Spinner) this.findViewById(R.id.Spinner01); 26 spinner.setAdapter(adapter); 27 spinner.setPrompt("请选择城市:"); 28 } 29 }
运行效果和 用法一 相同。
注意:
1.被注释的代码可以代替
private static final String[] cities = {"上海", "北京", "南京", "哈尔滨", "乌鲁木齐", "符拉迪沃斯托克", "圣弗朗西斯科"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, cities);
两条语句的组合。
2.ArrayAdapter 构造函数中的第二个参数是 android.R.layout. simple_spinner_item , adapter.setDropDownViewResource 中的参数则是 android.R.layout. simple_spinner_dropdown_item 。它们是不一样的。
自定义下拉菜单里的样式,其关键在于调用setDropDownViewResource方法,以XML的方式定义下拉菜单要显示的模样.
三、混合方式
1.在资源文件 (strings.xml) 中,相关的资源描述为:
2.在布局文件 (main.xml) 中, Spinner 的描述为:
< Spinner android:id = "@+id/Spinner01" android:layout_width = "wrap_content" android:layout_height = "wrap_content" />
3.在 Activity 对应的代码中做相关修改,使之如下:
1 public class ControlSpinner extends Activity 2 { 3 private Spinner spinner ; 4 @Override 5 public void onCreate(Bundle savedInstanceState) 6 { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.main); 9 10 ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource (this, R.array.cities, android.R.layout.simple_spinner_item); 11 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 12 13 spinner = (Spinner) this.findViewById(R.id.Spinner01); 14 spinner.setAdapter(adapter); 15 spinner.setPrompt("请选择城市:"); 16 } 17 18 }
运行效果与 用法一 一样。
注意:
1.ArrayAdapter<CharSequence> adapter 中的模板参数必须为 CharSequence
2.createFromResource 的第二个参数 R.array.cities 就是在 strings.xml 中定义的资源
四、改变 Spinner 对象本身的大小,及其文字的大小和颜色
1.在布局文件 (main.xml) 中,修改 Spinner 对象的描述如下:
<Spinner android:id="@+id/Spinner01" android:layout_width="160px" android:layout_height="40px" />
这使得 Spinner01 的宽度为 160 个像素,高度为 40 个像素。
2.创建一个布局文件 spinnerLayout.xml ,使之如下:
<?xmlversion="1.0"encoding="utf-8"?>
<TextViewxmlns:andro>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="#FF8B1500"
android:gravity="center"
/>
3.在 Activity 对应的代码中做相关修改,使之如下:
1 public class ControlSpinner extends Activity 2 { 3 private Spinner spinner; 4 @Override 5 public void onCreate(Bundle savedInstanceState) 6 { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.main); 9 10 ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource (this, R.array.cities, R.layout. spinnerlayout); 11 //改为 spinnerlayout 12 13 adapter.setDropDownViewResource(R.layout.spinnerlayout); 14 // 改为 spinnerlayout 15 16 spinner = (Spinner) this.findViewById(R.id.Spinner01); 17 spinner.setAdapter(adapter); 18 spinner.setPrompt("请选择城市:"); 19 } 20 }
运行结果如下:
五、同时显示图片和文本
假定有澳大利亚、瑞士、中华人民共和国和美利坚合众国这4个国家,我们想把它们的国旗和它们的国名同时显示在Spinner中。
它们对应的国旗图片资源分别如下:
对应的图片文件名分别为: au.png, ch.png, cn.png 和 us.png 。
1.首先把国旗图片拖入 res/drawable-mdpi 文件夹。系统会自动为我们在 R.java 中生成相应的 id 。情形如下:
public static final class drawable { public static final int au=0x7f020000; public static final int ch=0x7f020001; public static final int cn=0x7f020002; public static final int icon=0x7f020004; // 系统自带的 icon 图标 public static final int us=0x7f020005; }
2.在 strings.xml 中给出各个国家的国名。
<stringname="au">澳大利亚</string> <stringname="ch">瑞士</string> <stringname="cn">中华人民共和国</string> <stringname="us">美利坚合众国</string>
保存后,系统也会自动为我们在 R.java 中生成相应的 id 。情形如下:
public static final class string { public static final int app_name=0x7f040001; // 系统自带的 string public static final int au=0x7f040002; public static final int ch=0x7f040003; public static final int cn=0x7f040004; public static final int us=0x7f040006; }
3.假定在布局文件 (main.xml) 中, Spinner01 的属性如下:
<Spinner android:id="@+id/Spinner01" android:layout_width="300px" android:layout_height="48px" />
4.在 Activity 对应的代码中做相关修改,使之如下:
1 public class ControlSpinner extends Activity 2 { 3 private Spinner spinner ; 4 // 国旗图片 ID 数组 5 private int [] drawableIDs = {R.drawable.au, R.drawable.ch, R.drawable.cn, R.drawable.us}; 6 7 // 国名文字 ID 数组 8 private int [] nameIDs = {R.string.au, R.string.ch, R.string.cn, R.string.us}; 9 10 // 自定义一个 Adapter ,要重写 getCount 、 getItem 、 getItemId 和 getView 方法。其中的 getView 方法最为重要。 11 12 // 当然也可以先独立定义一个 Adapter 类 13 private BaseAdapter customizedAdapter = new BaseAdapter() 14 { 15 public int getCount() 16 { 17 // TODO Auto-generated method stub 18 return drawableIDs.length ; 19 } 20 21 public Object getItem(int position) 22 { 23 // TODO Auto-generated method stub 24 return drawableIDs[position]; 25 } 26 27 public long getItemId(int position) 28 { 29 // TODO Auto-generated method stub 30 return position; 31 } 32 33 public View getView(int position, View convertView, ViewGroup parent) 34 { 35 // TODO Auto-generated method stub 36 // 先设定一个 LinearLayout 对象 ll 37 LinearLayout ll = new LinearLayout(ControlSpinner.this); 38 39 // 使 ll 的 Orientation 为 HORIZONTAL 40 ll.setOrientation(LinearLayout.HORIZONTAL); 41 42 // 在垂直方向居中 43 ll.setGravity(Gravity.CENTER_VERTICAL); 44 45 // 创建一个 ImageView 对象 46 ImageView iv = new ImageView(ControlSpinner.this); 47 48 // 指定对应 position 的 Image 49 iv.setImageResource(drawableIDs[position]); 50 51 // 设定 ImageView 对象 iv 的宽度为 100 像素,高度为 40 像素 52 53 iv.setLayoutParams(new ViewGroup.LayoutParams(100, 40)); 54 55 // 将 iv 加入到 ll 56 ll.addView(iv); 57 58 // 创建一个 TextView 对象 59 TextView tv = new TextView(ControlSpinner.this); 60 61 // 指定对应 position 的 Text 62 tv.setText(nameIDs[position]); 63 // 设定文字大小 64 tv.setTextSize(14); 65 // 设定文字颜色 66 tv.setTextColor(Color.BLUE); 67 // 将 tv 加入到 ll 68 ll.addView(tv); 69 70 return ll; 71 } 72 }; 73 74 @Override 75 public void onCreate(Bundle savedInstanceState) 76 { 77 super.onCreate(savedInstanceState); 78 setContentView(R.layout.main); 79 80 spinner = (Spinner) this.findViewById(R.id.Spinner01); 81 spinner.setAdapter(customizedAdapter); 82 spinner.setPrompt("请选择国家:"); 83 } 84 }
运行结果如下:
如果独立建一个 CustomizedAdapter ,相关代码改写如下:
1 class CustomizedAdapter extends BaseAdapter 2 { 3 private Context ctx; 4 private int drawableIDs[]; 5 private int stringIDs[]; 6 public CustomizedAdapter(Context ctx, int DrawableIDs[], int StringIDs[]) 7 { 8 this.ctx = ctx; 9 this.drawableIDs = DrawableIDs; 10 this.stringIDs = StringIDs; 11 } 12 13 public int getCount() 14 { 15 // TODO Auto-generated method stub 16 return drawableIDs.length; 17 } 18 19 public Object getItem(int position) 20 { 21 // TODO Auto-generated method stub 22 return drawableIDs[position]; 23 } 24 25 public long getItemId(int position) 26 { 27 // TODO Auto-generated method stub 28 return position; 29 } 30 31 public View getView(int position, View convertView, ViewGroup parent) 32 { 33 // TODO Auto-generated method stub 34 LinearLayout ll = new LinearLayout(ctx); 35 ll.setOrientation(LinearLayout.HORIZONTAL); 36 ll.setGravity(Gravity.CENTER_VERTICAL); 37 38 ImageView iv = new ImageView(ctx); 39 iv.setImageResource(drawableIDs[position]); 40 iv.setLayoutParams(new ViewGroup.LayoutParams(100, 40)); 41 42 ll.addView(iv); 43 44 TextView tv = new TextView(ctx); 45 tv.setText(stringIDs[position]); 46 tv.setTextSize(14); 47 tv.setTextColor(Color.BLUE); 48 ll.addView(tv); 49 50 return ll; 51 } 52 }