开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
前言
在上一篇android之spinner控件用法详解(上)介绍了spinner的基本用法,但UI设计总是花样百出,丝毫不管开发的死活,对于一些小细节的设置总是让人恼火,本章讲针对一些spinner的小设计进行说明。
spinner的使用
设置spinner下拉列表的分割线和列表内边距
- 我们可以直接通过设置style修改spinner下拉列表本身的属性实现,在styles.xml文件中添加自定义的spinner样式,需设置parent为"android:Widget.ListView.DropDown"(Android原生下拉列表)
<style name="ThemeSpinner" parent="android:Widget.ListView.DropDown">
//分割线样式
<item name="android:divider">@drawable/spinner_divider_inset</item>
<item name="android:dividerHeight">1px</item>
//下拉列表内边距
<item name="android:paddingStart">5dp</item>
<item name="android:paddingEnd">5dp</item>
//去除下拉列表滑动条
<item name="android:scrollbars">none</item>
</style>
分割线样式spinner_divider_inset.xml:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="11dp"
android:insetRight="11dp">
<shape android:shape="rectangle">
<solid android:color="#DDDDDD"/>
</shape>
</inset>
- 设置完成后需添加至需设置的activity的style中
<style name="SpinnerActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
、、、
<item name="android:dropDownListViewStyle">@style/ThemeSpinner</item>
</style>
- 在AndroidManifest.xml注册的activity添加主题
<activity
android:name=".activities.SpinnerActivity"
android:theme="@style/SpinnerActivityTheme" />
设置spinner下划线点击状态和不选中状态
在style中设置:
<!-- Color when pressed -->
<item name="colorAccent">#ffffff</item>
<!-- Default color for the dropdown arrow and line -->
<item name="colorControlNormal">#ffffff</item>
自定义spinner样式,去除自带spinner下划线
我们可以通过设置colorAccent颜色与背景色相同,但这样局限性大,可以自定义spinner样式设置background
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:width="98dp"
android:height="54dp">
<shape android:shape="rectangle">
<solid android:color="#ffffff" />
</shape>
</item>
<item
android:width="14dp"
android:height="8dp"
android:drawable="@drawable/ic_spinner_dowm"
android:gravity="end|center_vertical" />
</layer-list>
效果图:
动态设置spinner下拉框的位置以及高度
需要通过映射动态获取到下拉列表弹窗ListPopupWindow对象,通过setVerticalOffset/setHorizontalOffset偏移量改变位置
try {
Field popup = Spinner.class.getDeclaredField("mPopup");
popup.setAccessible(true);
// Get private mPopup member variable and try cast to ListPopupWindow
android.widget.ListPopupWindow popupWindow = (android.widget.ListPopupWindow) popup.get(mSpinner);
popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
//转换成px效果更佳
popupWindow.setHeight(500);
popupWindow.setVerticalOffset(240);
} catch (NoClassDefFoundError | ClassCastException | NoSuchFieldException | IllegalAccessException e) {
Log.e(TAG, "onFinishInflate:" + e.getMessage());
}
题外话:天气转凉,注意保暖。啊,好想去北方看厚厚的雪......