自定义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,这样子项的角就被包含在整个下拉框中了。

相关推荐
阿珍爱上了阿强,在一个有星星的夜晚17 分钟前
node后端页面性能监测分析
java·学习方法
Java程序之猿25 分钟前
SpringBoot + camel+IBM MQ实现消息队列处理
java·spring boot·mybatis
z_鑫1 小时前
SpringCloud FeignClient 中 Bean 重复注册冲突解决方案解析
java·spring boot·spring cloud
孫治AllenSun1 小时前
【线程池】优化等待队列和拒绝策略
java·spring boot·spring cloud
毕设源码-邱学长2 小时前
【开题答辩全过程】以 基于Spring Boot的体育场地预约管理系统为例,包含答辩的问题和答案
java·spring boot·后端
青槿吖2 小时前
第二篇:告别XML臃肿配置!Spring注解式IOC/DI保姆级教程,从入门到真香
xml·java·开发语言·数据库·后端·sql·spring
simplepeng2 小时前
Room 3.0 KMP Alpha-01
android·kotlin·android jetpack
摇滚侠2 小时前
讲一讲 SpringMVC,线程变量 ThreadLocal 的使用
java·spring boot·intellij-idea
Lei活在当下3 小时前
Windows 下 Codex 高效工作流最佳实践
android·openai·ai编程