Android年份选择器(超简单-可直接复制使用)

效果图

思路

1、流程:

通过点击textview触发年份选择器dialog显示,选中年份后,更新到textview。

2、如何只显示年份?

隐藏月份和天数即可(但仍需给一个初始化数据)。

实现

1、直接新建一个工具类OnPickYearClickListener.class(可直接复制)

java 复制代码
/**
 * 年份选择器自定义
 */
public class OnPickYearClickListener implements View.OnClickListener {
    private Context context;
    private TextView textview; // 选中的年份显示文本标签(按你自己需求替换对应的组件类型)
    private int now_choose_year; // 当前选中年份(默认今年)

    /**
     * 年份选择器初始化
     * @param context
     * @param textview
     */
    public OnPickYearClickListener(Context context, TextView textview) {
        
        // 绑定
        this.context = context;
        this.textview = textview;

        // 初始化当前选中年份
        final Calendar c = Calendar.getInstance();
        now_choose_year = c.get(Calendar.YEAR);

        // 更新文本标签
        setTextYear(now_choose_year);
    }

    /**
     * 年份选择器触发显示
     * @param v
     */
    @Override
    public void onClick(View v) {
        // 获取当前时间
        final Calendar c = Calendar.getInstance();
        int monthOfYear = c.get(Calendar.MONTH);
        int dayOfMonth = c.get(Calendar.DAY_OF_MONTH);

        // 显示选择器
        DatePickerDialog datePickerDialog = new DatePickerDialog(context, DatePickerDialog.THEME_HOLO_LIGHT, mDateSetListener, now_choose_year, monthOfYear, dayOfMonth);
        DatePicker datePicker = datePickerDialog.getDatePicker();
        ((ViewGroup) ((ViewGroup) datePicker.getChildAt(0)).getChildAt(0)).getChildAt(1).setVisibility(View.GONE); // 隐藏月份
        ((ViewGroup) ((ViewGroup) datePicker.getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE); // 隐藏日
        datePickerDialog.show();
    }

    /**
     * 年份选择器-选中后监听
     */
    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            setTextYear(year); // 更新文本标签
            now_choose_year = year; // 更新选中选项
        }
    };

    /**
     * 修改textview年份显示
     * @param year
     */
    private void setTextYear(int year) {
        textview.setText(String.valueOf(new StringBuilder().append(year))); // 更新文本标签
    }

}

2、在需要使用的activity中如下调用即可

java 复制代码
private TextView textview;

textivew = findViewById(R.id.textview);

// 监听textview的点击事件(你也可以按需替换成相应的组件类型)
textview.setOnClickListener(new OnPickYearClickListener(this, textview));
相关推荐
Pika2 小时前
深入浅出Compose HitTest 机制
android·android jetpack
资深web全栈开发3 小时前
CoI - 组合优于继承:解耦的艺术
android·java·开发语言
冬奇Lab3 小时前
WMS进阶:多窗口模式与显示管理深度解析
android·源码阅读
加农炮手Jinx4 小时前
Flutter for OpenHarmony:web_socket_channel 全平台 WebSocket 通信标准库,从原理到鸿蒙实战(3000字深度解析)
android·前端·网络·websocket·flutter·华为·harmonyos
王码码20354 小时前
Flutter for OpenHarmony:web_socket 纯 Dart 标准 WebSocket 客户端(跨平台兼容性之王) 深度解析与鸿蒙
android·前端·websocket·网络协议·flutter·华为·harmonyos
zh_xuan6 小时前
kotlin runBlocking函数
android·kotlin·协程·runblocking
三少爷的鞋7 小时前
别再 launch(IO) 了:协程线程切换的 3隐藏反模式
android
贤泽9 小时前
Android 15 Lock Task 模式深度分析(第二部分)
android
huohuopro9 小时前
Vue3 Webview 转 Android 虚拟导航栏遮挡问题记录
android·vue
zh_xuan9 小时前
kotlin 挂起函数
android·开发语言·kotlin