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: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);
//给默认显示项和下拉菜单设置背景  

时间: 2024-11-05 17:18:25

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

Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment

你可以把fragment看成是activity的模块化部分,它拥有自己的生命周期,接受它自己的输入事件,你可以在activity运行时添加或者删除它(有点像是一个"子activity",你可以在不同的activity中重用它).本课将向你展示如何使用Support Libaray继承 Fragment 类来让你的应用能够兼容正在运行Android 1.6的设备. 提示: 如果你决定你的应用需求的最低API级别是11或者更高,那么你不需要使用Support Library,你可以直接使用

关于android中v7包(appcompat)的说明

关于android中v7包(appcompat)的说明,有需要的朋友可以参考下. 大家对于v4包都已经很熟悉了,现在在新建android项目时,v4包是默认导入的.v7包出来没多长时间,用的人也不多,主要对3.0以下版本提供ActionBar支持,以及SearchView,PopupMenu等控件的支持.因为一些开源框架已经实现对3.0以下版本ActionBar的支持,所以v7包的使用意义也不是很大.既然谷歌官方提供了这个功能,也很有必要学习一下.现在根据自己在官方文档上的学习和实践,现总结如下

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

最近好久没有更新博文,一则是因为公司最近比较忙,另外自己在Android学习过程和简易版微信的开发过程中碰到了一些绊脚石,所以最近一直在学习充电中.下面来列举一下自己所走过的弯路: (1)本来打算前端(即客户端)和后端(即服务端)都由自己实现,后来发现服务端已经有成熟的程序可以使用,如基于XMPP协议的OpenFire服务器程序:客户端也已经有成熟的框架供我们使用,如Smack,同样基于XMPP协议.这一系列笔记式文章主要是记录自己学习Android开发的过程,为突出重点(Android的学习)

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

通过前面的几篇博客,大家看到了Google是如何解释action bar和fragment以及推荐的用法.俗话说没有demo的博客不是好博客,下面我会介绍一下action bar和fragment在实战中的应用,以及相关demo源码,希望和大家相互交流. 了解过fragment的同学们应该都知道,fragment是android 3.0版本才出现的的,因此如果要在支持android 3.0一下版本的工程中使用fragment的话是需要添加Support Library的.具体如何添加我就不再赘述

我的Android 4 学习系列之创建应用程序和Activity:Manifest、Application、Activity

目录 介绍Android应用程序组件,以及使用这些组件构建的各种Android应用程序 Android应用程序的生命周期 如何创建应用程序Manifest 如何使用外部资源提供对位置.语言和硬件配置的支持 如何实现和使用自己的Application类 如何创建新的Activity 理解Activity的状态转换和生命周期 Android应用程序的组成部分 Android应用程序是由松散耦合的组件构成的,并使用应用程序Manifest绑定到一起. Manifest描述了每一个组件以及他们之间的交互

Android学习路线(七)设置Action Bar

在action bar最今本的形式中,它仅仅在左边展示了activity的标题以及应用的icon.即使在这种简单的形式中,它也只是告诉用户现在在应用的哪个activity中,同时为你的应用保持一个标识. 图1. 一个展示应用icon和activity标题的action bar 设置一个基本的action bar需要你的应用使用支持action bar的主题.如何来请求这样的主题要看你所选择的你的应用最低支持的Android版本.因此本课会根据应用支持的不同的Android最低版本分为两个部分.

站在巨人的肩膀上学习Android开发

我们知道,一开始最好的学习方法是模仿,尤其是模仿巨人.那说到Android开发的模仿自然就是分析并研究主流程序的布局.实现方法,进而提升自己的技术. 第一招----逆向工程 要分析"巨人"们的软件,自然免不了逆向工程,即将APK程序转化为我们可以看的懂得源码.这个google官方已经帮我们做好了工具,apktool就是一款很好的逆向工具. 下载地址为:http://pan.baidu.com/s/1kTqRhaR 我们以分析微信为例来说明这个工具的使用: 你只需执行如下命令,即完成了反

Android自定义View学习笔记04

Android自定义View学习笔记04 好长时间没有写相关的博客了,前几周在帮学姐做毕设,所以博客方面有些耽误.过程中写了一个类似wp的磁贴的view,想再写个配套的layout,所以昨天看了一下自定义viewGroup的相关知识-晚上睡觉想了一下可行性不是很高-代码量还不如直接自己在xml上写来得快,速度上也是个问题.今天看了一下张鸿洋老师的Android 自定义View (三) 圆环交替 等待效果这篇博文,再加上前一段时间看到的一幅图,结合之前写的一个圆形imageView的实现博文And

Android学习路线(九)为Action Bar添加Style

这里先贴出原文,下次再来翻译::p 原文地址:http://developer.android.com/training/basics/actionbar/styling.html The action bar provides your users a familiar and predictable way to perform actions and navigate your app, but that doesn't mean it needs to look exactly the