自定义android下拉框

计划用成熟的第三方组件,但是查了下貌似不太多或者不太符合简单的需求,试了下NiceSpinner这个组件,样式挺好,但是它的下拉框文字大小和颜色不能自定义或者我没找到怎么去自定义的方式,最后不得已使用的是官方的Spinner(

复制代码
implementation 'com.google.android.material:material:1.2.0'

)。下来说下我的实现方式吧!

1.页面的标签和一些说明

XML 复制代码
<Spinner
    android:id="@+id/condition1"
    android:layout_width="@dimen/dp_90"
    android:layout_height="@dimen/dp_25"
    android:layout_marginLeft="0dp"
    android:layout_marginStart="0dp"
    android:paddingLeft="0dp"
    android:paddingStart="0dp"
    android:dropDownVerticalOffset="@dimen/dp_2"
    android:spinnerMode="dropdown"
    android:gravity="left"
    android:background="@drawable/spinner_bg"
    android:popupBackground="@drawable/spinner_dropdown_bg"
    android:dividerHeight="0dp"
    android:dropDownWidth="@dimen/dp_90"
    android:listSelector="@android:color/transparent"
    android:cacheColorHint="@android:color/transparent"/>
复制代码
spinner_bg文件(白色背景,圆角)
XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <!-- 背景填充色(根据你的界面调整,比如透明/浅灰) -->
    <!-- 白色边框:width是边框宽度,color是白色 -->
    <solid android:color="@android:color/white" />
    <stroke
        android:width="1dp"
        android:color="@android:color/white" />
    <!-- 可选:圆角(根据需求调整) -->
    <corners android:radius="12dp" />
    <!-- 可选:内边距,避免文字贴边框 -->
    <padding
        android:left="8dp"
        android:top="4dp"
        android:right="8dp"
        android:bottom="4dp" />
</shape>
复制代码
spinner_dropdown_bg文件,与spinner_bg类似,(重要提示,如果想要下拉框是圆角,必须要给将下拉框上下留有一定的padding,不然会出现一些样式问题)
XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <!-- 下拉列表背景色(浅灰,和你原有一致) -->
    <solid android:color="@android:color/white" />
    <!-- 白色边框(保留) -->
    <!-- 核心:增大圆角半径(8dp更明显,可调整为12dp) -->
    <corners android:radius="12dp" />
    <!-- 新增:内边距,避免下拉项贴圆角边缘导致圆角看不见 -->
    <padding
        android:left="@dimen/dp_1"
        android:top="@dimen/dp_2"
        android:right="@dimen/dp_1"
        android:bottom="@dimen/dp_2" />
</shape>

2.java代码和一些说明

java 复制代码
        ArrayList<String> mData  = new ArrayList<String>();
        mData.add("高一");
        mData.add("高二");
        mData.add("高三");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_custom_mian, mData  );
        adapter.setDropDownViewResource(R.layout.spinner_custom_item);
        condition.setAdapter(adapter);
        //初始化
        condition.setSelection(initPosition);

        condition.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                // 当用户选中下拉选项时触发此方法
                // position:选中项的下标(从0开始),比如选"高一"是0,"高二"是1,"高三"是2
                // 获取选中的选项文本
                TextView x = (TextView)view;
                LogUtils.e("Spinner",x.getText().toString()+"");
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // 当没有选中任何项时触发(极少出现,比如Spinner数据为空时)
                // 一般无需处理,留空即可
            }
        });
复制代码
R.layout.spinner_custom_mian文件(自定义了字体颜色和字体大小):
java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_tab_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:textSize="@dimen/dp_9"
    android:paddingLeft="@dimen/dp_5"
    android:textColor="@color/newBlue"/>
复制代码
R.layout.spinner_custom_item文件(子项文件):
java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_tab_text"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dp_25"
    android:gravity="center"
    android:paddingLeft="@dimen/dp_10"
    android:paddingRight="@dimen/dp_10"
    android:paddingTop="4dp"
    android:paddingBottom="4dp"
    android:textSize="@dimen/dp_9"
    android:textColor="@drawable/spinner_item_text_color"
    android:background="@drawable/spinner_item_selector"
    />
复制代码
spinner_item_text_color文件(选中文字后文字变蓝色,不选中为黑色):
XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 选中状态(点击/选中时):文字红色 -->
    <item android:color="@color/newBlue" android:state_selected="true" />
    <!-- 按下状态(点击瞬间):可选,也设为红色增强交互 -->
    <item android:color="@color/newBlue" android:state_pressed="true" />
    <!-- 默认状态:原有颜色 #040930 -->
    <item android:color="@color/newBlack" />
</selector>
复制代码
spinner_item_selector文件(这个文件貌似没有太大作用了,自己可以不设置试试):
XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <!-- 下拉列表背景色(浅灰,和你原有一致) -->
    <solid android:color="@android:color/white" />
</shape>

效果图:

以上为满足自身需求的所有代码。大家可根据自己的需求进行删减,这些文件有些可能也可以替换或者为多余设置。

遇到的问题:

1.下拉框与主体框的宽度不一致(通过设置主题的margin和下拉框子项的宽度来解决);

2.下拉框选项选中的颜色(子项文件中的选中文件解决);

3.下拉框设置圆角(不设置圆角不涉及该问题),子项如果设置圆角子项四个角漏出选中的橙色背景,子项如果设置直角,下拉框的四个圆角会漏出第一项上左右角和最后一项下左右角的白色,导致圆角不园。最后处理方式是给下拉框上下留够一定的padding,这样子项的角就被包含在整个下拉框中了。

相关推荐
程序猿零零漆2 分钟前
【Spring Boot开发实战手册】掌握Springboot开发技巧和窍门(六)创建菜单和游戏界面(下)
java·spring boot·游戏
coding者在努力3 分钟前
LangChain之Prompt核心组件.2026年新版讲解,超详细
android·langchain·prompt
甲枫叶14 分钟前
【claude产品经理系列11】实现后端接口——数据在背后如何流动
java·数据库·人工智能·产品经理·ai编程·visual studio code
甲枫叶16 分钟前
【claude产品经理系列12】接入数据库——让数据永久保存
java·数据库·人工智能·产品经理·ai编程
追随者永远是胜利者20 分钟前
(LeetCode-Hot100)283. 移动零
java·算法·leetcode·职场和发展·go
城东米粉儿28 分钟前
Kotlin suspendCancellCoroutine 笔记
android
Jomurphys40 分钟前
Android 优化 - R8 混淆
android
abyyyyy12342 分钟前
oj题目练习
java·前端·数据库
有一个好名字44 分钟前
JAVA虚拟机-JVM
java·开发语言·jvm
玄〤1 小时前
枚举问题的两大利器:深度优先搜索(DFS)与下一个排列(Next Permutation)算法详解(Java版本)(漫画解析)
java·算法·深度优先·dfs