AppCompat学习(1)-AppCompatSpinner
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: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的更多相关文章
- 报错:You need to use a Theme.AppCompat theme (or descendant) with this activity.
学习 Activity 生命周期时希望通过 Dialog 主题测试 onPause() 和 onStop() 的区别,点击按钮跳转 Activity 时报错: E/AndroidRuntime: FA ...
- Android学习笔记(第一篇)编写第一个程序Hello World+Activity
PS:终于开始正式的搞Android了...无人带的一介菜鸟,我还是自己默默的努力吧... 学习内容: 1.编写第一个Hello World程序.. 学习Android,那么就需要有一个编译器来集 ...
- [转]AppCompat 22.1,Goole暴走,MD全面兼容低版本
AppCompat 22.1,Goole暴走,MD全面兼容低版本 分类: Android2015-04-24 09:48 1354人阅读 评论(0) 收藏 举报 android 目录(?)[+] ...
- Android学习之路——简易版微信为例(三)
最近好久没有更新博文,一则是因为公司最近比较忙,另外自己在Android学习过程和简易版微信的开发过程中碰到了一些绊脚石,所以最近一直在学习充电中.下面来列举一下自己所走过的弯路: (1)本来打算前端 ...
- 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 ...
- 开源项目Material Calendar View 学习记录 (一)
开源项目Material Calendar View 学习记录 Github: https://github.com/prolificinteractive/material-calendarview ...
- Android学习路线(二十四)ActionBar Fragment运用最佳实践
转载请注明出处:http://blog.csdn.net/sweetvvck/article/details/38645297 通过前面的几篇博客.大家看到了Google是怎样解释action bar ...
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
- Android学习之基础知识十五 — 最佳UI体验(Material Design实战)
一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...
随机推荐
- [VIM] 格式化代码
快速使用vim格式化代码 在vim的编辑模式i下直接ESC退出道命令模式之后直接敲入如下命令: gg=G 将全部代码格式化 nG=mG 将第n行到第m行的代码格式化 注:如果ESC ...
- Linux第三次学习笔记
#信息的表示和处理 三种重要的数字表示 1. 无符号数编码: 基于传统的二进制表示法,表示大于或者等于零的数字. 2. 补码编码: 表示有符号数整数的最常见的方式,有符号数就是只可 以为正或者为负的数 ...
- Opencv step by step - 鼠标事件
鼠标事件有下面几种(没有滚轮事件,比较遗憾): #define CV_EVENT_MOUSEMOVE 0 滑动 #define CV_EVENT_LBUTTONDOWN 1 左键点击 #define ...
- 回顾一年的IT学习历程与大学生活
今天是2015年8月27日,距离成为大三狗还有一个多星期,在这个不算繁忙的暑假的下午来总结一下这一年来,在IT方面的学习. 一.入门(2014.3) 我大一的专业是信息工程,信息工程听上去就是信息(I ...
- 按照需要分别率长宽比导出图片(python 3)
效率提升的问题 之前朋友需要把大量的图片用分辨率进行区分查找,他说都是打开图片,然后用尺子在屏幕上量......我也是瀑布汗....花的点时间帮他写的小软件,解决这个蛋疼的问题 解决方案 本想用批处理 ...
- get与post
1. get是从服务器上获取数据,post是向服务器传送数据.2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过H ...
- js对象中的回调函数
假设一个页面new多个同类型的对象,且该对象内部含异步请求的回调,很有可能回调函数中的this指向最后一次new的对象. 解决该问题的办法是,异步请求使用$.ajax并制定其context为this, ...
- iOS不得姐项目--登录模块的布局,设置文本框占位文字颜色,自定义内部控件竖直排列的按钮
一.登录模块的布局 将一整部分切割成若干部分来完成,如图分成了三部分来完成 设置顶部状态栏为白色的方法 二.设置文本框占位文字颜色 <1>方法一与方法二实现原理是同一种,都是通过设置pla ...
- BACKBONE源代码解析
//2014.11// Backbone.js 1.0.0 // (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc. // Backbone may b ...
- Java基础-final和static的区别
很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变.看下面这个例子: public class Test { ...