[转]Spinner的常用技巧

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

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

 < 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 。

运行结果:

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

用法 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( " 请选择城市 : " );

               }

                   … …

         }

  

运行结果如下:

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

假定有澳大利亚、瑞士、中华人民共和国和美利坚合众国这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 中给出各个国家的国名。

< 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( " 请选择国家: " );

               }

                   … …

         }

  

运行结果如下:

如果独立建一个 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 中的代码一致。运行结果:

可见可以正确地获得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)

                  {

                  }

                   … …

}

  

其他代码与用法 6 同。

其中, onItemSelected 方法解释如下:

public abstract void onItemSelected (AdapterView <?> parent, View view, int position, long id)
 
Callback method to be invoked when an item in this view has been selected. Impelmenters can call getItemAtPosition(position) if they need to access the data associated with the selected item.

Parameters

parent               The AdapterView where the selection happened

view                  The view within the AdapterView that was clicked

position            The position of the view in the adapter

id                        The row id of the item that is selected

时间: 2024-11-02 16:34:02

[转]Spinner的常用技巧的相关文章

【转】 Spinner的常用技巧

原文网址:http://blog.csdn.net/wanli_smile/article/details/6410388 用法 1 :以资源方式,静态展示 Spinner 选项 1.     在资源文件 (strings.xml) 中,增加: < string name = "spin_prompt" > 请选择城市 </ string > < string-array name = "cities" > < item &

HTML5-移动开发常用技巧与弹性布局的使用

一.移动开发常用技巧 Viewport基本知识 设置布局Viewport的各种信息 1.width=device-width: 设置Viewport视口宽度等于设备宽度 2.initial-scale=1: 网页默认缩放比为1(网页在手持设备上,不会进行默认缩放 3.minimum-scale=1 网页最小缩放比为1 4.maximum-scale=1 网页最小大缩放比为1 5.user-scalable=no 禁止用户手动缩放网页(ios10+ 的设备失效) 在手机站及响应式网站的制作中,网页

【转】oracle存储过程常用技巧

原文链接 http://www.cnblogs.com/chinafine/archive/2010/07/12/1776102.html 我们在进行pl/sql编程时打交道最多的就是存储过程了.存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识.如:游标的处理,异常的处理,集合的选择等等 1.存储过程结构 1.1 第一个存储过程 create or replace procedure proc1( p_para1 varchar2,

.Net常用技巧_导出 Excel 和相关打印设置

Excel.Application myExcel = new Excel.Application();发 表Excel.Workbook workbookData = myExcel.Application.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);Excel.Worksheet xlSheet = (Worksheet)workbookData.Worksheets[1];//取得sheet1 1) 显示当前窗口: xlSheet.

mysql 常用技巧

1.正则使用 比 LIKE 会牺牲很多的系统资源 尽量不要用 正则的语法和JS PHP 差不多 select * from t1 where email REGEXP "@163[,.]com$"; select * from t1 where email like "%@163.com" or email like "%@163,com" 2.REPLACE 函数的使用 UPDATE `v9_zhushou` SET `thumb` = REP

sqlmap常用技巧整理

言 通过在乌云网上出现的很多SQL注入漏洞,因此来总结一下,大致使用SQLMAP所遇到的参数. 基本结构 基本SQLMAP的使用方式就如下所示,使用参数式的方式,按需求添加. 12 sqlmap.py -u "http:// *" --data="a=b" -p a --level 3 --random-agent --referer="a" --technique T --dbms=mysql --cookie="cookie&quo

短线选股操作常用技巧

股票短线通常是指在一个星期或两个时期以内的时期,股票投资者只想赚取短期差价收益,而不去关注股票的基本情况,主要依据技术图表分析.一般的投资者做短线通常都是以两三天为限,一旦没有差价可赚或股价下跌,就平仓一走了之,再去买其他股票做短线.作为短线炒股,选股很重要,因为短线讲究的是一个快,快进快出,绝不拖延,频率较快,不同于长线的价值投资,所以换股会比较频繁,这种情况下选股就比较讲究. 一.短线选股操作常用技巧 1.首选短期热点龙头股 短线操作的对象就是要选择被市场广泛关注,而大部分人还在犹豫而不敢介

.Net常用技巧_VS2005[C#] 操作 Excel 全攻略(转)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Office.Interop.Excel; using System.Data.SqlClient; using System.Data.

.Net常用技巧_操作Excel知识点

C#操作Excel知识点 近期在使用C#操作excel,主要是读取excel模板,复制其中的模板sheet页,生成多个sheet页填充相应数据后另存到excel文件,所用到的知识点如下. 一.添加引用和命名空间 添加Microsoft.Office.Interop.Excel引用,它的默认路径是C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Off