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. WebAPI使用多个xml文件生成帮助文档(转)

    http://www.cnblogs.com/idoudou/p/xmldocumentation-for-web-api-include-documentation-from-beyond-the- ...

  2. Android完美禁用Home键

    重写Activity的onAttachedToWindow 方法 @Override public void onAttachedToWindow() { System.out.println(&qu ...

  3. [CareerCup] 7.7 The Number with Only Prime Factors 只有质数因子的数字

    7.7 Design an algorithm to find the kth number such that the only prime factors are 3,5, and 7. 这道题跟 ...

  4. eclipse的一些初始化设置

    eclipse下载地址:http://www.eclipse.org/ 添加java注释模板 codetemplates.xml:Window->Preferences->Java-> ...

  5. HoloLens开发手记 - Unity之Locatable camera 使用相机

    Enabling the capability for Photo Video Camera 启用相机能力 为了使用摄像头,我们必须启用WebCam能力. 在Unity中打开Player settin ...

  6. WDCP安装并配置php5.4和mongodb

    记录一下,免得忘了.全部都是自己测试用过的安装过程没有问题. linux常用命令 mv 移动文件 mkdir 创建文件夹 rm 删除 cp 复制 netstat 网络状态 tar 解压 wget 下载 ...

  7. 从日常开发说起,浅谈HTTP协议是做什么的。

    引言 HTTP协议作为Web开发的基础一直被大多数人所熟知,不过相信有很多人只知其一不知其二.比如咱们经常用到的session会话机制是如何实现的,可能很多人都说不出来吧.其实session会话就是H ...

  8. jQuery基础之(三)jQuery功能函数前缀及与window.onload冲突

    1.jQuery功能函数前缀 在javascript中,开发者通常会编写一些小函数来处理各种操作细节,例如在用户提交表单时,要将文本框最前端和最末端的空格内容清理掉.而javascript中没有类似t ...

  9. Apache CXFjar包目录(转)

    文件目录结构及相关文件的详细说明:|-bin|-docs|-etc|-lib|-licenses|-modules|-samples bin(目录) bin 目录中是 CXF 框架中所提供的代码生成. ...

  10. python 读写文件和设置文件的字符编码

    一. python打开文件代码如下: f = open("d:\test.txt", "w") 说明:第一个参数是文件名称,包括路径:第二个参数是打开的模式mo ...