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

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

spinner的使用步骤如下:

1.设置数据源


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

values/arrays.xml

<!--?xml version="1.0" encoding="utf-8"?-->
<resources>
<string-array name="week">
<item>星期一</item>
<item>星期二</item>
<item>星期三</item>
<item>星期四</item>
<item>星期五</item>
<item>星期六</item>
<item>星期天</item>
</string-array>
</resources>

layout/login.xml

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

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

2.设置显示主题


 <android.support.v7.widget.AppCompatSpinner
android:id="@+id/sp_select_email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/login_company_email"
android:spinnerMode="dropdown"
android:theme="@style/common_spinner"
/>

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

styles.xml

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

3.添加响应事件


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

mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<!--?--> parent, View view, int position, long id) {
//选择列表项的操作
} @Override
public void onNothingSelected(AdapterView<!--?--> parent) {
//未选中时候的操作
}
});

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

适配器的选择:

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

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

R.layou.item_select

<!--?xml version="1.0" encoding="utf-8"?-->
<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"> </textview>

R.layout.item_drop

<!--?xml version="1.0" encoding="utf-8"?-->
<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"> </textview>

效果如下图所示:

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

自定义Adapter:

private class MyAdapter implements SpinnerAdapter {
private ThemedSpinnerAdapter.Helper helper; @Override
public void registerDataSetObserver(DataSetObserver observer) { } @Override
public void unregisterDataSetObserver(DataSetObserver observer) { } @Override
public int getCount() {
return mList.size();
} @Override
public Object getItem(int position) {
return mList.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public boolean hasStableIds() {
return false;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = new TextView(mContext);
textView.setTextSize(30);
textView.setBackgroundColor(getResources().getColor(R.color.colorAccent));
textView.setText(mList.get(position));
return textView;
} @Override
public int getItemViewType(int position) {
return 1;
} @Override
public int getViewTypeCount() {
return 1;
} @Override
public boolean isEmpty() {
return false;
} @Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
TextView textView = new TextView(mContext);
textView.setTextSize(30);
textView.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
textView.setText(mList.get(position));
return textView;
}
}

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

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

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

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

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. python数字图像处理(1):环境安装与配置

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

  2. Linux 基础入门

    实验一(Linux 系统简介): 了解了一些有关Linux的重要人物,以及 实验二(基本概念及操作): Linux终端 1.Terminal(终端):当你切换到其中一个终端后想要切换回图形界面,你可以 ...

  3. 树莓派之web服务器搭建

    树莓派之web服务器搭建 (一)使用ufw创建防火墙 设置目的:可以完全阻止对树莓派的访问也可以用来配置通过防火墙对特点程序的访问.使用防火墙更好的保护树莓派. 准备工作 1.带有5V电源的树莓派 2 ...

  4. UIView的layoutSubviews和drawRect方法何时调用 ———转

    转自:http://jianyu996.blog.163.com/blog/static/112114555201305113018814/ 首先两个方法都是异步执行.layoutSubviews方便 ...

  5. iOS项目重构日记

    如何重构 首先,要对程序的一般架构烂熟于心,尤其是MVC,这是基本.还有就是分离存储和网络请求的逻辑. 对于一些常用的控件尽量分离复用,设置开关函数,适当的时候开启,不要的时候关闭,有必要的话还可以 ...

  6. iOS——关于打印控件

    20.UIPrintFormatterUIPrintFormatter时打印格式化的抽象基类:展示了传统的可打印的内容对象可以跨页边界.由于打印格式化,打印系统,可以自动打印与打印格式化的内容相关联的 ...

  7. double相加(減)结果会有些误差

    前提介绍 今天在调试代码的时候发现了一个double类型数据相减的有趣问题,148163.1 - 82692.09大家猜猜结果等于多少,经过调试最终为5471.010000000009. 是不是很奇怪 ...

  8. HoloLens开发手记 - Unity之场景共享 Shared holographic experiences in Unity

    佩戴HoloLens的多个用户可以使用场景共享特性来获取集合视野,并可以与固定在空间中某个位置的同一全息对象进行交互操作.这一切是通过空间锚共享(Anchor Sharing)来实现的. 为了使用共享 ...

  9. JavaScript基础1

    JavaScript写在<script></script>之间   <script type="text/javascript">表示在< ...

  10. 如何在Oracle中导入dmp文件

    Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中. 利 ...