android spinner学习

摘要:
注:1。带注释的代码可以替换privatestaticfinalString[]cities={“上海”、“北京”、“南京”、“哈尔滨”、“乌鲁木齐”、“符拉迪沃斯托克”、“旧金山”};并且ArrayAdapter<String>adapter=newArrayAdaper<String>;两种陈述的组合。

  

用法 1 :以资源方式,静态展示 Spinner 选项

1.     在资源文件 (strings.xml) 中,增加:

         < string name = "spin_prompt" > 请选择城市 </ string >

         < string-array name = "cities" >

                   < item > 北京 </ item >

                   < item > 上海 </ item >

                   < item > 南京 </ item >

                   < item > 乌鲁木齐 </ item >

                   < item > 哈尔滨 </ item >

                   < item > 符拉迪沃斯托克 </ item >

         </ string-array >

2.     在布局文件 (main.xml) 中,增加:

         < Spinner

                   android:id = "@+id/Spinner01"

                   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 。

         运行结果:


 android spinner学习第1张

点击Spinner右边的带倒三角的按钮,即出现各城市选项如下:

android spinner学习第2张
用法 2 :以代码方式,动态展示 Spinner 选项

1.     在资源文件 strings.xml 中,无需定义任何资源。

2.     在布局文件 (main.xml) 中, Spinner 的描述为:

         < Spinner

                   android:id = "@+id/Spinner01"

                   android:layout_width = "wrap_content"

                  android:layout_height = "wrap_content"

         />

3.     在 Activity 对应的代码中做相关修改,使之如下:

public class ControlSpinner extends Activity

{

                   private static final String tag = "ControlSpinner" ;

                   private static final String[] cities =

                            { " 上海 " , " 北京 " , " 南京 " , " 哈尔滨 " , " 乌鲁木齐 " , " 符拉迪沃斯托克 " , " 圣弗朗西斯科 " };
 
               private Spinner spinner ;

               @Override

               public void onCreate(Bundle savedInstanceState)

               {

                    super .onCreate(savedInstanceState);

                    setContentView(R.layout. main );

                    ArrayAdapter<String> adapter = new ArrayAdapter<String>( this , android.R.layout. simple_spinner_item , cities );
 
//      ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
 
//      adapter.add(" 上海 ");

//      adapter.add(" 北京 ");

//      adapter.add(" 南京 ");

//      adapter.add(" 哈尔滨 ");

//      adapter.add(" 乌鲁木齐 ");

//      adapter.add(" 符拉迪沃斯托克 ");

//      adapter.add(" 圣弗朗西斯科 ");

                    adapter.setDropDownViewResource(android.R.layout. simple_spinner_dropdown_item );
 
                    spinner = (Spinner) this .findViewById(R.id. Spinner01 );

           spinner .setAdapter(adapter);

                    spinner .setPrompt( " 请选择城市 : " );

               }

                   … …

         }

         运行效果和用法 1 相同。

         注意:

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 。它们是不一样的。
 
 

用法 3 :混合方式

1.     在资源文件 (strings.xml) 中,相关的资源描述为:

2.     在布局文件 (main.xml) 中, Spinner 的描述为:

         < Spinner

                   android:id = "@+id/Spinner01"

                   android:layout_width = "wrap_content"

                   android:layout_height = "wrap_content"

         />

3.     在 Activity 对应的代码中做相关修改,使之如下:

public class ControlSpinner extends Activity

{

               private Spinner spinner ;

               @Override

               public void onCreate(Bundle savedInstanceState)

               {

                    super .onCreate(savedInstanceState);

                    setContentView(R.layout. main );

                    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource ( this ,

                             R.array. cities ,

                             android.R.layout. simple_spinner_item );

                    adapter.setDropDownViewResource(android.R.layout. simple_spinner_dropdown_item );
 
                    spinner = (Spinner) this .findViewById(R.id. Spinner01 );

                    spinner .setAdapter(adapter);

                    spinner .setPrompt( " 请选择城市: " );

               }

                   … …

         }

运行效果与方法 1 也一样。

注意:

1.     ArrayAdapter<CharSequence> adapter 中的模板参数必须为 CharSequence

2.     createFromResource 的第二个参数 R.array.cities 就是在 strings.xml 中定义的资源

用法 4 :改变 Spinner 对象本身的大小,及其文字的大小和颜色

1.     在布局文件 (main.xml) 中,修改 Spinner 对象的描述如下:

         < Spinner

                   android:id = "@+id/Spinner01"

                   android:layout_width = "160px"

                   android:layout_height = "40px"

         />

这使得 Spinner01 的宽度为 160 个像素,高度为 40 个像素。

2.     创建一个布局文件 spinnerLayout.xml ,使之如下:

<? xml version = "1.0" encoding = "utf-8" ?>

         < TextView xmlns:android = "http://schemas.android.com/apk/res/android"

    android:layout_width = "fill_parent"

               android:layout_height = "wrap_content"

               android:textSize = "12sp"         

               android:textColor = "#FF8B1500"

               android:gravity = "center"

         />

3.     在 Activity 对应的代码中做相关修改,使之如下:

public class ControlSpinner extends Activity

{

               private Spinner spinner ;

    @Override

               public void onCreate(Bundle savedInstanceState)

               {

                    super .onCreate(savedInstanceState);

                    setContentView(R.layout. main );

                    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource ( this ,

                             R.array. cities ,

                             R.layout. spinnerlayout );                                                                     // 改为 spinnerlayout
 
                    adapter.setDropDownViewResource(R.layout. spinnerlayout );           // 改为 spinnerlayout
 
                    spinner = (Spinner) this .findViewById(R.id. Spinner01 );

                    spinner .setAdapter(adapter);

                    spinner .setPrompt( " 请选择城市 : " );

               }

                   … …

         }

运行结果如下:


 

android spinner学习第3张

android spinner学习第4张

用法5:同时显示图片和文本

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

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

android spinner学习第5张android spinner学习第6张android spinner学习第7张android spinner学习第8张
对应的图片文件名分别为: 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 中给出各个国家的国名。

         < string name = "au" > 澳大利亚 </ string >

         < string name = "ch" > 瑞士 </ string >

         < string name = "cn" > 中华人民共和国 </ string >

         < string name = "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 对应的代码中做相关修改,使之如下:

public class ControlSpinner extends Activity

{

               private Spinner spinner ;

                // 国旗图片 ID 数组

               private int [] drawableIDs = {

                        R.drawable. au ,

                        R.drawable. ch ,

                        R.drawable. cn ,

                        R.drawable. us

               };

                   // 国名文字 ID 数组

               private int [] nameIDs = {

                        R.string. au ,

                        R.string. ch ,

                        R.string. cn ,

                        R.string. us

               };

   

                   // 自定义一个 Adapter ,要重写 getCount 、 getItem 、 getItemId 和 getView 方法。其中的 getView 方法最为重要。
 
                   // 当然也可以先独立定义一个 Adapter 类

               private BaseAdapter customizedAdapter = new BaseAdapter()

               {

                            public int getCount()

                            {

                                     // TODO Auto-generated method stub

                                     return drawableIDs . length ;

                            }

                            public Object getItem( int position)

                            {

                                     // TODO Auto-generated method stub

                                     return drawableIDs [position];

                           }

                            public long getItemId( int position)

                           {

                                     // TODO Auto-generated method stub

                                     return position;

                            }

                            public View getView( int position, View convertView, ViewGroup parent)
 
                           {

                                     // TODO Auto-generated method stub

                                     // 先设定一个 LinearLayout 对象 ll

                                     LinearLayout ll = new LinearLayout(ControlSpinner. this );
 
                                     // 使 ll 的 Orientation 为 HORIZONTAL

                                     ll.setOrientation(LinearLayout. HORIZONTAL );
 
                                     // 在垂直方向居中

                                     ll.setGravity(Gravity. CENTER_VERTICAL );

                           

                                     // 创建一个 ImageView 对象

                                     ImageView iv = new ImageView(ControlSpinner. this );
 
                                     // 指定对应 position 的 Image

                                     iv.setImageResource( drawableIDs [position]);
 
                                     // 设定 ImageView 对象 iv 的宽度为 100 像素,高度为 40 像素
 
                                     iv.setLayoutParams( new ViewGroup.LayoutParams(100, 40));
 
                                     // 将 iv 加入到 ll

                                     ll.addView(iv);                    

                           

                                     // 创建一个 TextView 对象

                                     TextView tv = new TextView(ControlSpinner. this );
 
                                     // 指定对应 position 的 Text

                                     tv.setText( nameIDs [position]);

                                     // 设定文字大小

                                     tv.setTextSize(14);

                                     // 设定文字颜色

                                     tv.setTextColor(Color. BLUE );

                                     // 将 tv 加入到 ll

                                     ll.addView(tv);

                           

                                     return ll;

                            }

                  };

                  

               @Override

               public void onCreate(Bundle savedInstanceState)

               {

                    super .onCreate(savedInstanceState);

                    setContentView(R.layout. main );

                    spinner = (Spinner) this .findViewById(R.id. Spinner01 );

                    spinner .setAdapter( customizedAdapter );

                    spinner .setPrompt( " 请选择国家: " );

               }

                   … …

         }

         运行结果如下:

 运行结果如下:

android spinner学习第9张

android spinner学习第10张

  如果独立建一个 CustomizedAdapter ,相关代码改写如下:

         class CustomizedAdapter extends BaseAdapter

{

                   private Context ctx ;

                   private int drawableIDs [];

                   private int stringIDs [];

                   public CustomizedAdapter(Context ctx, int DrawableIDs[], int StringIDs[])
 
                   {

                            this . ctx = ctx;

                            this . drawableIDs = DrawableIDs;

                            this . stringIDs = StringIDs;

                   }

        

                   public int getCount()

                   {

                            // TODO Auto-generated method stub

                            return drawableIDs . length ;

                   }

                   public Object getItem( int position)

                   {

                            // TODO Auto-generated method stub

                            return drawableIDs [position];

                   }

                   public long getItemId( int position)

                   {

                            // TODO Auto-generated method stub

                            return position;

                   }

                   public View getView( int position, View convertView, ViewGroup parent)
 
                   {

                            // TODO Auto-generated method stub

                            LinearLayout ll = new LinearLayout( ctx );

                            ll.setOrientation(LinearLayout. HORIZONTAL );

                            ll.setGravity(Gravity. CENTER_VERTICAL );

                  

                            ImageView iv = new ImageView( ctx );

                            iv.setImageResource( drawableIDs [position]);

                            iv.setLayoutParams( new ViewGroup.LayoutParams(100, 40));
 
                            ll.addView(iv);                    

                  

                            TextView tv = new TextView( ctx );

                            tv.setText( stringIDs [position]);

                            tv.setTextSize(14);

                            tv.setTextColor(Color. BLUE );

                            ll.addView(tv);

                  

                            return ll;

                   }

}

         Activity 对应的代码改写如下:

public class ControlSpinner extends Activity

{

    private Spinner spinner ;

   

               private int [] drawableIDs = {

                        R.drawable. au ,

               R.drawable. ch ,

                        R.drawable. cn ,

                        R.drawable. us

               };

    private int [] nameIDs = {

                        R.string. au ,

                        R.string. ch ,

               R.string. cn ,

                        R.string. us

               };

                  

    @Override

    public void onCreate(Bundle savedInstanceState)

         {

        super .onCreate(savedInstanceState);

                  setContentView(R.layout. main );

               CustomizedAdapter customizedAdapter = new CustomizedAdapter( this , drawableIDs , nameIDs );
 
               spinner = (Spinner) this .findViewById(R.id. Spinner01 );

            spinner .setAdapter(customizedAdapter);

            spinner .setPrompt( " 请选择国家 : " );

        }

         … …

       }

         所得到的效果,和前面的情况是一样的。

        

用法 6 :获取所选项目的文本内容

1.     正常情况下 ( 用法 1~ 用法 4 所示的情形 ) ,我们可以通过这样的方式,来获取 Spinner 对象中所选项目的文本内容:

TextView tx_spinner = (TextView) spinner .getSelectedView();

String str = (String) tx_spinner.getText();

Toast.makeText ( this , str, Toast. LENGTH_LONG ).show();

2.     但是如果我们使用用法 5 中自定义的 Adapter ,就需要做一些稍微的改变,才能正常得到 Spinner 所选项目的文字内容。因为, CustomizedAdapter 中的 getView 方法,最后返回的是一个 LinearLayout 对象 (LinearLayout 继承了 View) ,而在 LinearLayout 对象中,又包含了一个 ImageView 和一个 TextView 。所以,
 
TextView tx_spinner = (TextView)spinner .getSelectedView();

这句话就不再使用了。因为 spinner.getSelectView() 会返回一个包含了一个 ImageView 和一个 TextView 的 LinearLayout 对象,而不再是一个单纯的 TextView 了。
 
 

         为此,我们在布局文件 main.xml 中,增加一个 Button ,因为我们想在点击一个按钮的情况下,获取 Spinner 中所选中的文字内
 
容。如下:

         < Button

                   android:id = "@+id/Button01"

                   android:layout_width = "120px"

                   android:layout_height = "60px"

                   android:text = "OK"

         />

        

         用法 5 中的 CustomizedAdapter 中的 getView 方法要增加一行代码 ( 粗体字 ) ,修改后如下

         public View getView( int position, View convertView, ViewGroup parent)

         {

                   // TODO Auto-generated method stub

                   LinearLayout ll = new LinearLayout( ctx );

                   ll.setOrientation(LinearLayout. HORIZONTAL );

                   ll.setGravity(Gravity. CENTER_VERTICAL );

                  

                   ImageView iv = new ImageView( ctx );

                   iv.setImageResource( drawableIDs [position]);

                   iv.setLayoutParams( new ViewGroup.LayoutParams(100, 40));

                   ll.addView(iv);                    

                  

                   TextView tv = new TextView( ctx );

                   tv.setText( stringIDs [position]);

                   tv.setTextSize(14);

                   tv.setTextColor(Color. BLUE );

                   tv.setTag( "tagTextView" );                 // 为 TextView 对象增加一个 Tag , 以便在后续的处理中 , 可以通过
 
                   ll.addView(tv);                                        // findViewWithTag 方法来获取这个 TextView 对象
 
                  

                   return ll;

         }

         修改 Activity 所对应的代码,使之如下:

         public class ControlSpinner extends Activity

implements

OnClickListener

{

               private Spinner spinner ;

               … …

                  

    @Override

               public void onCreate(Bundle savedInstanceState)

               {

                    super .onCreate(savedInstanceState);

           setContentView(R.layout. main );

                    CustomizedAdapter customizedAdapter = new CustomizedAdapter( this , drawableIDs , nameIDs );
 
                    spinner = (Spinner) this .findViewById(R.id. Spinner01 );

                    spinner .setAdapter(customizedAdapter);

                    spinner .setPrompt( " 请选择国家 : " );

                    // 获取按钮对象并为之增加监听器 :

                    Button button = (Button) this .findViewById(R.id. Button01 );
 
                    button.setOnClickListener( this );

               }

                  public void onClick(View v)

                  {

                            // TODO Auto-generated method stub

                    if (v.getId() == R.id. Button01 )

                    {

                                     // 方法 1~ 方法 4 的情形,可以使用如下被注释的的代码:

// TextView tx_spinner = (TextView)spinner.getSelectedView();

// String str = (String) tx_spinner.getText();

// Toast.makeText(this, str, Toast.LENGTH_LONG).show();

// 方法 5 所列的情形,需用如下方式获得 Spinner 所选中项目的文字内容

                              LinearLayout ll = (LinearLayout) spinner .getSelectedView();
 
                              TextView tv = (TextView)ll.findViewWithTag( "tagTextView" );         // 得到相应的 TextView 对象
 
                              String str = (String)tv.getText();

                              Toast.makeText ( this , str, Toast. LENGTH_LONG ).show();
 
                    }

                  }

                   … …

         }

         其他代码和用法 5 中的代码一致。运行结果:


 android spinner学习第11张

可见可以正确地获得Spinner所选项目中的文字内容。

用法 7 :在 onItemSelected 方法中,获取所选项目的文本内容。

1.     首先让 Activity 实现 OnItemSelectedListener 接口

2.     给 spinner 对象增加 OnItemSelectedListener

3.     实现 OnItemSelectedListener 接口中定义的两个接口方法 onItemSelected 和 onNothingSelected

代码如下:

public class ControlSpinner extends Activity

implements

OnClickListener, OnItemSelectedListener

{

               private Spinner spinner ;

                  … …

               @Override

               public void onCreate(Bundle savedInstanceState)

               {

                    super .onCreate(savedInstanceState);

                    setContentView(R.layout. main );

                    CustomizedAdapter customizedAdapter = new CustomizedAdapter( this , drawableIDs , nameIDs );
 
                    spinner = (Spinner) this .findViewById(R.id. Spinner01 );

                    spinner .setAdapter(customizedAdapter);

                    spinner .setPrompt( " 请选择国家 : " );

                    // 获取按钮对象并为之设定 listener :

                    Button button = (Button) this .findViewById(R.id. Button01 );
 
                    button.setOnClickListener( this );

       

                    // 为 spinner 设定 listener :

                    spinner .setOnItemSelectedListener( this );

               } 

   

               public void onItemSelected(AdapterView<?> parent, View view, int position, long id)

               {

                            // 以下代码,适用于用法 1~4 中的情形

                            // if(parent.getId() == R.id.Spinner01)

                            // {

                            //      Toast.makeText(this, ((TextView)view).getText(), Toast.LENGTH_LONG).show();//tv.getText();
 
                            // }

                  

                            if (parent.getId() == R.id. Spinner01 )

                            {

                                      LinearLayout ll = (LinearLayout)view;

                                      TextView tv = (TextView)ll.findViewWithTag( "tagTextView" );

                             String str = (String)tv.getText();

                             Toast.makeText ( this , str, Toast. LENGTH_LONG ).show();

                            }                                                                                                                                                                             

               }

                                                        

                  public void onNothingSelected(AdapterView<?> parent)

                  {

                  }

                   … …

}

本文转自:http://blog.csdn.net/wanli_smile/article/details/6410388

免责声明:文章转载自《android spinner学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用create-react-app构建的项目(并引入react-app-polyfill做IE兼容)在开发环境下的IE浏览器中报错的解决方案XML常用标签的介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

asp中将文本框内的日期转换成datetime类型的数据

将字符类型的日期转化为DateTime类型主要有以下方法: 方法一:Convert.ToDateTime(string) string格式有要求,必须是yyyy-MM-dd hh:mm:ss 方法二:Convert.ToDateTime(string, IFormatProvider) DateTimedt; DateTimeFormatInfo...

如何自定义MVC控件?

今天公司要写学习总结,想着想着还是先写一篇关于MVC内部什么东东的博客整理整理再发表吧,一举两得。 之前写过了路由、过滤器等。今天就研究一下怎么自定义MVC控件吧。 本人技术小菜,不喜勿喷。。。。。(说这句话通常有两种情况,一种是牛人谦虚的说法,一种是怕受伤害提前准备个挡箭牌) 首先我们先去熟知一下MVC内部的那些控件是怎么实现的。 首先,Input标签是...

java 基本理论知识点

http://www.cnblogs.com/hellokitty1/p/4491808.html 1、main方法是怎么写的        public static void main(String [] args){}//最习惯的      public static void main(String  args[]){}      static p...

VLC客户端和SDK的简单应用

VLC_SDK编程指南 VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。它可以支持目前市面上大多数的视频解码,除了Real。 VLC_SDK的调用 VLC的SDK使用C语言写成,它的解码库部分的基础是FFMpeg,FFMpeg也是一套可以用来记录、转换数字音频、视频,并能将其转...

Unity 3D 的四种坐标系

1, World Space(世界坐标): 我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。 2, Screen Space(屏幕坐标): 以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位...

Java AES加密解密工具 -- GUI 、在线传输文件

原理 对于任意长度的明文,AES首先对其进行分组,每组的长度为128位。分组之后将分别对每个128位的明文分组进行加密。 对于每个128位长度的明文分组的加密过程如下: (1)将128位AES明文分组放入状态矩阵中。 (2)AddRoundKey变换:对状态矩阵进行AddRoundKey变换,与膨胀后的密钥进行异或操作(密钥膨胀将在实验原理七中详细讨论)。...