andriod中的spinner控件一共有两个,一个是本身的Spinner,一个是android.support.v7.widget.AppCompatSpinner。

两者的区别在于v7内的Spinner是兼容低版本的,Spinner再高版本中才能使用的方法换了v7下的Spinner后可以一直兼容到2.1 (v7兼容到api7),初次之外两者的使用没有其他差别,推荐使用v7,保证效果在不同版本上都能显示。

spinner的使用步骤如下:

1.设置数据源


在values文件夹下新建如下文件:

values/arrays.xml

  1. <!--?xml version="1.0" encoding="utf-8"?-->
  2. <resources>
  3. <string-array name="week">
  4. <item>星期一</item>
  5. <item>星期二</item>
  6. <item>星期三</item>
  7. <item>星期四</item>
  8. <item>星期五</item>
  9. <item>星期六</item>
  10. <item>星期天</item>
  11. </string-array>
  12. </resources>

layout/login.xml

  1. <android.support.v7.widget.AppCompatSpinner
  2. android:id="@+id/sp_select_email"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:entries="@array/login_company_email"
  6. android:spinnerMode="dropdown"
  7. android:theme="@style/common_spinner"
  8. />
 
android:entries // 传入的是values文件夹下的arrayx.xml内的数据
android:spinnerMode  //显示模式有popmenu和dialog两种
android:prompt //当显示模式为dialog时生效,作用为显示dialog的标题内容

还有一些其它常用的属性:

2.设置显示主题


  1. <android.support.v7.widget.AppCompatSpinner
  2. android:id="@+id/sp_select_email"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:entries="@array/login_company_email"
  6. android:spinnerMode="dropdown"
  7. android:theme="@style/common_spinner"
  8. />

@style/common_spinner设置的是下拉item的主题。

styles.xml

  1. <style name="common_spinner" parent="Widget.AppCompat.DropDownItem.Spinner">
  2. <item name="android:textColor">@color/app_text_color</item>
  3. <item name="android:textSize">14sp</item>
  4. </style>

3.添加响应事件


Spinner的响应事件是OnItemSelectedListener ,千万不要写出onItemClickListener,否则直接报错:

  1. mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  2. @Override
  3. public void onItemSelected(AdapterView<!--?--> parent, View view, int position, long id) {
  4. //选择列表项的操作
  5. }
  6.  
  7. @Override
  8. public void onNothingSelected(AdapterView<!--?--> parent) {
  9. //未选中时候的操作
  10. }
  11. });

也可以使用代码添加数据源给spinner,此时布局文件中只需要包含基本的宽高属性即可。

适配器的选择:

最方便的的适配器是ArrayAdapter,缺点是只能显示单个TextView内容(采用List存储数据)

  1. ArrayAdapter arrayAdapter = new ArrayAdapter(mContext, R.layout.item_select, mList);
  2. //传入的参数分别为 Context , 未选中项的textview , 数据源List
  3. //单独设置下拉的textview
  4. arrayAdapter.setDropDownViewResource(R.layout.item_drop);

R.layou.item_select

  1. <!--?xml version="1.0" encoding="utf-8"?-->
  2. <textview xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:textsize="20dp"
      android:typeface="serif"
      android:gravity="center"
      android:textcolor="#000000"
      android:layout_height="match_parent"
      android:background="@color/colorAccent"
      android:orientation="vertical">
  3.  
  4. </textview>

R.layout.item_drop

  1. <!--?xml version="1.0" encoding="utf-8"?-->
  2. <textview xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:padding="5dp"
      android:background="@color/colorPrimary"
      android:gravity="center"
      android:orientation="vertical"
      android:textcolor="#000000"
      android:textsize="20dp">
  3.  
  4. </textview>

效果如下图所示:

有时实际的需求中有可能需要Spinner的下拉不单单显示一个TextView,那么这个时候就需要对适配器进行自定义

自定义Adapter:

  1. private class MyAdapter implements SpinnerAdapter {
  2. private ThemedSpinnerAdapter.Helper helper;
  3.  
  4. @Override
  5. public void registerDataSetObserver(DataSetObserver observer) {
  6.  
  7. }
  8.  
  9. @Override
  10. public void unregisterDataSetObserver(DataSetObserver observer) {
  11.  
  12. }
  13.  
  14. @Override
  15. public int getCount() {
  16. return mList.size();
  17. }
  18.  
  19. @Override
  20. public Object getItem(int position) {
  21. return mList.get(position);
  22. }
  23.  
  24. @Override
  25. public long getItemId(int position) {
  26. return position;
  27. }
  28.  
  29. @Override
  30. public boolean hasStableIds() {
  31. return false;
  32. }
  33.  
  34. @Override
  35. public View getView(int position, View convertView, ViewGroup parent) {
  36. TextView textView = new TextView(mContext);
  37. textView.setTextSize(30);
  38. textView.setBackgroundColor(getResources().getColor(R.color.colorAccent));
  39. textView.setText(mList.get(position));
  40. return textView;
  41. }
  42.  
  43. @Override
  44. public int getItemViewType(int position) {
  45. return 1;
  46. }
  47.  
  48. @Override
  49. public int getViewTypeCount() {
  50. return 1;
  51. }
  52.  
  53. @Override
  54. public boolean isEmpty() {
  55. return false;
  56. }
  57.  
  58. @Override
  59. public View getDropDownView(int position, View convertView, ViewGroup parent) {
  60. TextView textView = new TextView(mContext);
  61. textView.setTextSize(30);
  62. textView.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
  63. textView.setText(mList.get(position));
  64. return textView;
  65. }
  66. }

效果如下(对下拉和默认显示设置了颜色作为区分,且为方便起见没用引用布局文件,设置了下拉偏移):

至此适配器的使用的完成了,可以实现默认显示的和下拉的使用相同布局,也可是不同的布局,基本上满足需求了

另外还有几个在23中新出的方法,可以做更多的自定义(使用AppcomptSpinner可适配到低版本):

  1. mSpinner.setPopupBackgroundResource(R.drawable.back);
  2. mSpinner.setBackgroundResource(R.drawable.back);
  1. //给默认显示项和下拉菜单设置背景

AppCompat学习(1)-AppCompatSpinner的更多相关文章

  1. 报错:You need to use a Theme.AppCompat theme (or descendant) with this activity.

    学习 Activity 生命周期时希望通过 Dialog 主题测试 onPause() 和 onStop() 的区别,点击按钮跳转 Activity 时报错: E/AndroidRuntime: FA ...

  2. Android学习笔记(第一篇)编写第一个程序Hello World+Activity

    PS:终于开始正式的搞Android了...无人带的一介菜鸟,我还是自己默默的努力吧... 学习内容: 1.编写第一个Hello World程序..   学习Android,那么就需要有一个编译器来集 ...

  3. [转]AppCompat 22.1,Goole暴走,MD全面兼容低版本

    AppCompat 22.1,Goole暴走,MD全面兼容低版本 分类: Android2015-04-24 09:48 1354人阅读 评论(0) 收藏 举报 android   目录(?)[+] ...

  4. Android学习之路——简易版微信为例(三)

    最近好久没有更新博文,一则是因为公司最近比较忙,另外自己在Android学习过程和简易版微信的开发过程中碰到了一些绊脚石,所以最近一直在学习充电中.下面来列举一下自己所走过的弯路: (1)本来打算前端 ...

  5. Android Studio:You need to use a Theme.AppCompat theme (or descendant) with this activity. AlertDialog

    学习<第一行代码>的时候遇到的问题. Process: com.example.sevenun.littledemo, PID: 2085 java.lang.RuntimeExcepti ...

  6. 开源项目Material Calendar View 学习记录 (一)

    开源项目Material Calendar View 学习记录 Github: https://github.com/prolificinteractive/material-calendarview ...

  7. Android学习路线(二十四)ActionBar Fragment运用最佳实践

    转载请注明出处:http://blog.csdn.net/sweetvvck/article/details/38645297 通过前面的几篇博客.大家看到了Google是怎样解释action bar ...

  8. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  9. Android学习之基础知识十五 — 最佳UI体验(Material Design实战)

    一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...

随机推荐

  1. [VIM] 格式化代码

    快速使用vim格式化代码 在vim的编辑模式i下直接ESC退出道命令模式之后直接敲入如下命令: gg=G        将全部代码格式化 nG=mG    将第n行到第m行的代码格式化 注:如果ESC ...

  2. Linux第三次学习笔记

    #信息的表示和处理 三种重要的数字表示 1. 无符号数编码: 基于传统的二进制表示法,表示大于或者等于零的数字. 2. 补码编码: 表示有符号数整数的最常见的方式,有符号数就是只可 以为正或者为负的数 ...

  3. Opencv step by step - 鼠标事件

    鼠标事件有下面几种(没有滚轮事件,比较遗憾): #define CV_EVENT_MOUSEMOVE 0 滑动 #define CV_EVENT_LBUTTONDOWN 1 左键点击 #define ...

  4. 回顾一年的IT学习历程与大学生活

    今天是2015年8月27日,距离成为大三狗还有一个多星期,在这个不算繁忙的暑假的下午来总结一下这一年来,在IT方面的学习. 一.入门(2014.3) 我大一的专业是信息工程,信息工程听上去就是信息(I ...

  5. 按照需要分别率长宽比导出图片(python 3)

    效率提升的问题 之前朋友需要把大量的图片用分辨率进行区分查找,他说都是打开图片,然后用尺子在屏幕上量......我也是瀑布汗....花的点时间帮他写的小软件,解决这个蛋疼的问题 解决方案 本想用批处理 ...

  6. get与post

    1. get是从服务器上获取数据,post是向服务器传送数据.2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过H ...

  7. js对象中的回调函数

    假设一个页面new多个同类型的对象,且该对象内部含异步请求的回调,很有可能回调函数中的this指向最后一次new的对象. 解决该问题的办法是,异步请求使用$.ajax并制定其context为this, ...

  8. iOS不得姐项目--登录模块的布局,设置文本框占位文字颜色,自定义内部控件竖直排列的按钮

    一.登录模块的布局 将一整部分切割成若干部分来完成,如图分成了三部分来完成 设置顶部状态栏为白色的方法 二.设置文本框占位文字颜色 <1>方法一与方法二实现原理是同一种,都是通过设置pla ...

  9. BACKBONE源代码解析

    //2014.11// Backbone.js 1.0.0 // (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc. // Backbone may b ...

  10. Java基础-final和static的区别

    很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变.看下面这个例子: public class Test { ...