前言
在Android
开发过程中,我们偶尔会用到下拉框选择
的情况。那么今天就来讲讲实现这个功能的Spinner
控件吧。
今天涉及知识有:
- Spinner的使用详解
- Spinner优劣分析
- 下拉框功能优化
3.1 添加 anko 库依赖
3.2 TextView+弹框实现选择项 - 效果图和项目结构图
先来波效果图
一. Spinner的使用详解
其实我已经很久没有用Spinner
控件了,甚至于已经有些陌生。那么下面就贴出Spinner
控件具体使用的代码吧:
var array:Array<String> = arrayOf("王者荣耀","吃鸡","暗黑破坏神","红色警戒")
var adapter:ArrayAdapter<String> = ArrayAdapter(this,R.layout.spinner_item,array)
//设置下拉模式风格
adapter.setDropDownViewResource(R.layout.drop_item)
mSpinner.prompt="请选择要进入的游戏" //标题栏
mSpinner.adapter=adapter //设置adapter
mSpinner.setSelection(0) //设置默认选中项
//设置点击事件
mSpinner.onItemSelectedListener= object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(
parent: AdapterView<*>?,
view: View?,
position: Int,
id: Long
) {
toast("选中游戏:${array[position]}")
}
override fun onNothingSelected(parent: AdapterView<*>?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
这里需要注意的是,Spinner
作为一个下拉控件,一般需要与适配器ArrayAdapter
搭配使用。ArrayAdapter
初始化时,需要传三个参数(结合以上代码讲解):
- context: activity上下文
- R.layout.spinner_item:为自己定义的一个xml布局
- array:数组
其中spinner_item.xml
布局即为一开始进入界面时,Spinner
展示给我们看的背景布局,如下:
spinner_item.xml
布局代码如下:
<?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"/>
可以看出spinner_item.xml
布局中只能由一个控件,且为TextView
。
而第三个参数array
更是只能为数组,且数组只能存些基本数据类型。
接着看下面的代码:
//设置下拉模式风格
adapter.setDropDownViewResource(R.layout.drop_item)
此处setDropDownViewResource(R.layout.drop_item)
是用于设置下拉框的布局的,如下:
R.layout.drop_item.xml
代码如下:
<?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/blue"
android:gravity="center"
android:orientation="vertical"
android:textColor="#000000"
android:textSize="20dp"/>
和之前的spinner_item.xml
布局文件一样,R.layout.drop_item.xml
中只能放一个TextView
控件作为布局。
接下来的三行代码:
mSpinner.prompt="请选择要进入的游戏" //标题栏
mSpinner.adapter=adapter //设置adapter
mSpinner.setSelection(0) //设置默认选中项
分别设置了标题栏
,adapter
和默认选中项
。
最后一个监听是设置选中项点击事件的。
ok,这就是Spinner
使用的基本内容,当然,Spinner
作为基本的控件,别忘了在布局中添加该控件:
<Spinner
android:id="@+id/mSpinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/mBtnTest"/>
Spinner
使用效果图如下:
二. Spinner优劣分析
通过以上的讲解,我们可以看到Spinner
可以很快的实现一个下拉选择的功能,这是它的优点。当然由于现在app开发对于ui的高要求,Spinner
控件也存在以下弊端:
- 展示的内容太过单一
- 弹出下拉框时遮盖原本显示的数据
- Spinner 右侧的 小三角形图标不是很明显,且替换修改比较难弄
总之,就是Spinner
展示效果过于单一和固化,要改变起来异常艰难。这也是Spinner
在开发中使用非常少的原因。
三.下拉框功能优化
既然Spinner
在使用的过程中弊端太多,那么我们可以用 TextView+弹框
的方式来实现相同效果。在anko
库的加持下,实现此效果更加简单。但是,在实现之前,我们先要引入anko
的commons
库。
3.1 添加 anko 库依赖
在app_module
的build.gradle
中添加如下依赖: