一、以资源方式,静态展示 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右边的带倒三角的按钮,即出现各城市选项如下:

  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 }

  运行结果如下:

  Spinner的用法(转)

  Spinner的用法(转)

五、同时显示图片和文本

  假定有澳大利亚、瑞士、中华人民共和国和美利坚合众国这4个国家,我们想把它们的国旗和它们的国名同时显示在Spinner中。

  它们对应的国旗图片资源分别如下:

  Spinner的用法(转)Spinner的用法(转)Spinner的用法(转)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 }

  运行结果如下:

  Spinner的用法(转)

  Spinner的用法(转)

  如果独立建一个 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 }
View Code

相关文章:

  • 2021-06-11
  • 2021-04-03
  • 2021-06-19
  • 2021-09-04
  • 2021-08-02
  • 2022-12-23
  • 2022-01-01
猜你喜欢
  • 2022-12-23
  • 2021-09-04
  • 2022-02-28
  • 2021-03-31
  • 2021-12-28
  • 2022-12-23
  • 2021-12-24
相关资源
相似解决方案