计划用成熟的第三方组件,但是查了下貌似不太多或者不太符合简单的需求,试了下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,这样子项的角就被包含在整个下拉框中了。