android之spinner控件用法详解(下)

1,194 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

前言

在上一篇android之spinner控件用法详解(上)介绍了spinner的基本用法,但UI设计总是花样百出,丝毫不管开发的死活,对于一些小细节的设置总是让人恼火,本章讲针对一些spinner的小设计进行说明。

spinner的使用

设置spinner下拉列表的分割线和列表内边距

  1. 我们可以直接通过设置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>
  1. 设置完成后需添加至需设置的activity的style中
<style name="SpinnerActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
    、、、
    <item name="android:dropDownListViewStyle">@style/ThemeSpinner</item>
</style>
  1. 在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>

效果图: image.png

动态设置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());
}

题外话:天气转凉,注意保暖。啊,好想去北方看厚厚的雪......