【Android】自定义Spinner控件及其使用

这篇具有很好参考价值的文章主要介绍了【Android】自定义Spinner控件及其使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简单使用

1. 写选项值

res/values/ 文件夹下新建一个 arrays.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="spinner_string">
        <item>C语言</item>
        <item>C++</item>
        <item>python</item>
        <item>Java</item>
    </string-array>
</resources>

2. 在界面文件中添加Spinner控件

activity_main.xml 文件:

2.1 dropdown模式

<Spinner
        android:id="@+id/spinner"
        android:spinnerMode="dropdown"
        android:layout_width="150dp"
        android:entries="@array/spinner_string"/>

效果:
【Android】自定义Spinner控件及其使用

2.2 dialog模式

<Spinner
        ...
        android:spinnerMode="dialog"/>

效果:
【Android】自定义Spinner控件及其使用

二、自定义dropdown样式

1. 修改点击样式和下拉框样式

res/drawable/ 文件夹下新建两个文件:

(1)shape_for_custom_spinner.xml 文件(用来定义下拉框的样式):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 填充颜色 -->
    <solid android:color="@color/white"/>
    <stroke android:width="1dp" android:color="#661886F7"/>
    <!-- 矩形的圆角半径 -->
    <corners android:radius="6dp" />
</shape>

(2)selector_for_custom_spinner文件(用来定义Spinner控件本身的样式,带选择器,有点击效果):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <!-- 填充颜色 -->
            <solid android:color="#661886F7"/>
            <!-- 矩形的圆角半径 -->
            <corners android:radius="6dp" />
        </shape>
    </item>

    <item android:state_pressed="false">
        <shape android:shape="rectangle">
            <!-- 填充颜色 -->
            <solid android:color="@android:color/transparent"/>
            <stroke android:width="1dp" android:color="#661886F7"/>
            <!-- 矩形的圆角半径 -->
            <corners android:radius="6dp" />
        </shape>
    </item>
</selector>

在界面文件中的Spinner控件中引用它们:

<Spinner
        ...
        android:popupBackground="@drawable/shape_for_custom_spinner"
        android:background="@drawable/selector_for_custom_spinner"/>

效果:
【Android】自定义Spinner控件及其使用

2. 增加下划线

res/values/ 文件夹下新建一个style.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="customTheme">
        <item name="dropDownListViewStyle">@style/customSpinnerStyle</item>
    </style>
    <style name="customSpinnerStyle" parent="android:Widget.ListView.DropDown">
        <item name="android:textAlignment">center</item>
        <item name="divider">@color/black</item>
        <item name="android:dividerHeight">1dp</item>
    </style>
</resources>

说明:
(1)customTheme——自定义主题样式,引用它自定义下划线才能正常显示。
(2)customSpinnerStyle——自定义的Spinner样式,和上面的主题样式一样在界面文件中引用。
(3)android:divider——分割线颜色。
(4)android:dividerHeight——分割线宽度。

在界面文件中的Spinner控件中引用它:

    <Spinner
        ...
        android:paddingTop="15dp"
        android:paddingBottom="15dp"
        style="@style/customSpinnerStyle"/>

效果:
【Android】自定义Spinner控件及其使用

三、动态配置Spinner选项

1. 删除界面文件中引入的字符串组

即,删除这一行:

<Spinner
        ...
        android:entries="@array/spinner_string"
        .../>

2. 增加一个自定义的layout文件来配置列表样式

res/layout/ 文件夹下新建一个item_for_custom_spinner.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:gravity="center"
    android:text="下拉列表项样式"
    android:textColor="@color/purple_700"
    android:textSize="18dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="15dp"
    android:paddingBottom="15dp"
    android:singleLine="true"
    android:ellipsize="marquee"/>

3. 在Java文件中对Spinner控件进行配置

MainActivity.java文件:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        预定义变量
        Spinner spinner;
        List<String> listForSpinner = new ArrayList<>();
        ArrayAdapter<String> adapterForSpinner;
//        变量初始化
        spinner = findViewById(R.id.spinner);// 引用Spinner控件
//        给字符串数组赋初值
        listForSpinner.add("C语言");
        listForSpinner.add("Python");
        listForSpinner.add("Java");
        listForSpinner.add("C++");
//        设置适配器
        adapterForSpinner = new ArrayAdapter<>(MainActivity.this, R.layout.item_for_custom_spinner, listForSpinner);
        spinner.setAdapter(adapterForSpinner);
    }
}

说明:
不想自己自定义列表样式可以选择直接使用Android自带的support_simple_spinner_dropdown_item
效果:
【Android】自定义Spinner控件及其使用

四、Spinner选择事件

1. 增加一个简单的选择监听器

Toast toast = Toast.makeText(getApplicationContext(), "default toast", Toast.LENGTH_SHORT);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        toast.setText(listForSpinner.get(i));
        toast.show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }
});

【Android】自定义Spinner控件及其使用
可以发现有两个问题:
(1)初始化监听器的时候事件被调用了。
(2)重复点击同一选项事情不会被重复调用。

2. 不希望监听器动作初始化时就被调用

办法很简单,就是定义一个flag用来确认监听器是否是第一次被调用,是则忽略它:

final int[] flag = {0};
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        if (flag[0] == 0){
            flag[0] = flag[0] + 1;
            return;
        }
        ...
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }
});

这样一来,界面初始化时就不会出现监听器动作被执行了一次的情况了。

3. 不希望重复点击同一选项时没有动作

需要重写Spinner控件的部分代码。
(1)在java/com.example.myapplication/ 文件夹下新建一个ReSpinner.java文件:

package com.example.myapplication;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Spinner;

@SuppressLint("AppCompatCustomView")
public class ReSpinner extends Spinner {
    public boolean isDropDownMenuShown = false;

    /**
     * @param context 用来解决原生spinner点击同一选项无反应的问题
     */
    public ReSpinner(Context context) {
        super(context);
    }

    public ReSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ReSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setSelection(int position, boolean animate){
        boolean sameSelected = (position == getSelectedItemPosition());
        super.setSelection(position, animate);
        if (sameSelected){
            getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
        }
    }
    @Override
    public boolean performClick(){
        this.isDropDownMenuShown = true;
        return super.performClick();
    }
    @Override
    public void setSelection(int position){
        boolean sameSelected = (position == getSelectedItemPosition());
        super.setSelection(position);
        if (sameSelected){
            getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
        }
    }
}

(2)替换掉界面文件中的控件根名称,其他什么都不用动:

<Spinner
        .../>

改为

<com.example.myapplication.ReSpinner
        .../>

这样一来,重复点击同一事件,也能正常多次触发监听器动作了。

五、自定义dialog样式

经过上面的修改,基本已经完成了对dropdown模式下的样式自定义和监听器动作自定义了,将spinnerMode改回dialog,增加一个prompt标签,增加dialog的标题:
(1)先在res/values/strings.xml文件中定义一个标题(必须步骤):

<resources>
    <string name="app_name">My Application</string>
    <string name="spinner_title">Spinner Title</string>
</resources>

(2)再在边界文件中引用它:文章来源地址https://www.toymoban.com/news/detail-414755.html

<com.example.myapplication.ReSpinner
        ...
        android:spinnerMode="dialog"
        android:prompt="@string/spinner_title"
        .../>

到了这里,关于【Android】自定义Spinner控件及其使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android控件】HorizontalScrollView的基础使用记录(滚动条自定义)

    目录 ​​​​​​​ 效果图 简介 注意事项 基础属性 滚动条全部设置 滚动条是否总显示 自定义滚动条滑动背景和滚动条背景 设置滚动条的宽度 设置滚动条距离 其它常规设置 设置滚动速度 布局代码示例 总结 HorizontalScrollView是水平滚动标签。垂直滚动动是 ScrollView标签 H

    2024年02月10日
    浏览(30)
  • Android 之 Spinner (列表选项框)的基本使用

    本来本节是想给大家介绍一个Gallery(画廊)的一个控件的,后来想想还是算了,因为 在Android 4.1后就已经被弃用了,尽管我们可以通过兼容不来使用Gallery,不过想想 还是算了,因为Gallery在每次切换图片的时候,都需要重新创建视图,这样无疑会造成 很大资源浪费!我们可以通

    2024年02月10日
    浏览(41)
  • Android中实现RecyclerView,并对item及其多个子控件的点击事件监听

    目录 背景 实现RecyclerView 第一步、 新建item的xml 第二步、在activity的布局中引入 RecyclerView 第三步、新建一个adapter   第四步、在activity中初始化绑定adapter即可 实现item及其多个子组件点击事件监听 第一步、 适配器中创建监听对象 第二步、适配器中绑定监听item和子组件 第三

    2024年02月19日
    浏览(45)
  • Android:自定义控件

    1.自定义VIEW组件 创建CustomizeView,继承View。重写onDraw方法,通过onDraw方法绘制我们自定义的图像、位图、路径等。 示例: 创建对应layout文件,l_customize1.xml文件 示例: 补充:Canvas对象坐标变换方法 translate(100,100):平移变化; rotate(90):旋转变化; scale():缩放变化; save():保存当前

    2024年02月20日
    浏览(30)
  • QT在自定义类中调用主类(界面类ui及其控件)的一种实用方法

    在实际应用中,经常会出现需要自定义类访问界面中的控件的情况,使用信号和槽进行跳转往往过于繁琐,使用下述方法可以巧妙解决: 界面类 QtWidgetsTest.h QtWidgetsTest.cpp 自定义类 CustomClass.h 首先包含ui头文件(其实也可不写,因为cpp里一定会包含QtWidgetsTest.h并包含ui文件),

    2024年02月16日
    浏览(34)
  • 合宙Air724UG LuatOS-Air LVGL API控件-加载器(Spinner)

    加载器(Spinner) 通过  lvgl.spinner_create  就可创建一个加载器,本身自带动画效果。 可以通过  lvgl.spinner_set_arc_length  函数调整加载器的弧长。单位是度,一圈是按 360 度计算的。 通过  lvgl.spinner_set_spin_time  可以设置转速,这里的单位是 ms,是加载器转完一圈的时间,GIF 录制

    2024年02月09日
    浏览(30)
  • Android开发基础——自定义控件

    Android中常用控件和布局的继承结构如下图所示:  从上面可以看出,所有控件都是直接或间接继承自View的,所用的所有布局都是直接或间接继承自ViewGroup的。View是Android中最基本的一种UI组件,其可以在屏幕上绘制一块矩形区域,并能够响应这块区域的各种事件,因此,用户

    2023年04月10日
    浏览(31)
  • Android开发之自定义控件-组合控件的开发与实现

    最终实现的效果展示图:   类似支付宝微信,底部分隔线对齐标题效果:       完整渲染显示效果(包含三个条目右边不同颜色的文字): 立体效果:  隐藏资产总额条目右边更多箭头  隐藏中国历史条目右边的文字: 隐藏中国历史条目下边的分隔线: 隐藏条目2中国历史左

    2024年02月10日
    浏览(32)
  • QT自定义优雅的表单控件,简单实现设置界面布局

    FormView.h FormView.cpp 核心函数 函数 变量 功能 addEditableItem title: 输入框前面的提示文字,同时作为该控件的标识符 place_holder: 输入框中的提示文字 在表单中插入一个可填写项 addCheckableItem title: 不显示在UI中,仅作为该控件的标识符 content: 勾选框后面的内容 init_status: 勾选框的初

    2024年02月11日
    浏览(33)
  • 无涯教程-Android - Spinner函数

    Spinner允许您从下拉菜单中选择一个项目 例如。使用Gmail应用程序时,将显示如下所示的下拉菜单,您需要从下拉菜单中选择一个项目。 本示例演示计算机的类别,您需要从类别中选择一个类别。 以下是修改后的主要Activity文件src/com.example.spinner/AndroidSpinnerExampleActivity.java的内容。

    2024年02月10日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包