安卓选择器

一、首先引入依赖库

//时间选择器implementation 'io.github.ShawnLin013:number-picker:2.4.13'

二、自定义时间选择器

public class TimePickerCustom {private final BottomSheetDialog bottomDialog;private final NumberPicker year;private final NumberPicker month;private final NumberPicker day;/*** 时间选择回调**/public interface TimePickerCallback {/*** 回调** @param year 年* @param month 月* @param day 日*/void setDate(int year, int month, int day);}public TimePickerCustom(Context context, String title, TimePickerCallback callback) {// 设置时间选择器的布局以及弹窗的高度bottomDialog = getBottomDialog(context, R.layout.view_time_picker, dpToPx(context, 350));Calendar calendar = Calendar.getInstance();// 设置标题((TextView)bottomDialog.findViewById(R.id.title)).setText(title);// 年year = (NumberPicker)bottomDialog.findViewById(R.id.year);int yearNow = calendar.get(Calendar.YEAR);year.setMinValue(yearNow - 100);year.setMaxValue(yearNow + 100);year.setValue(yearNow);// 月month = (NumberPicker)bottomDialog.findViewById(R.id.month);String[] monthNum = new String[12];for (int i = 0; i < 12; i++) {monthNum[i] = (i + 1) + "月";}month.setMinValue(1);month.setMaxValue(monthNum.length);month.setDisplayedValues(monthNum);month.setValue(calendar.get(Calendar.MONTH));// 日day = (NumberPicker)bottomDialog.findViewById(R.id.day);day.setMinValue(1);int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);String[] newDays = getNewDays(days);day.setMaxValue(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));day.setDisplayedValues(newDays);day.setValue(calendar.get(Calendar.DATE));// 年份和月份更改时对应的天数需要更改year.setOnValueChangedListener((picker, oldVal, newVal) -> {updateNumberOfDays();day.setValue(calendar.get(Calendar.DATE));});month.setOnValueChangedListener((picker, oldVal, newVal) -> {updateNumberOfDays();day.setValue(calendar.get(Calendar.DATE));});// 取消按钮和确定按钮事件绑定View cancel = bottomDialog.findViewById(R.id.cancel);View ok = bottomDialog.findViewById(R.id.ok);if (cancel != null) {cancel.setOnClickListener(v -> bottomDialog.dismiss());}if (ok != null) {ok.setOnClickListener(v -> {bottomDialog.dismiss();callback.setDate(year.getValue(), month.getValue(), day.getValue());});}}/*** 底部弹出框** @param id 弹窗中的布局* @param height 弹窗高度*/private BottomSheetDialog getBottomDialog(Context context, Integer id, int height) {BottomSheetDialog bottomSheet = new BottomSheetDialog(context);// 设置对框框中的布局bottomSheet.setContentView(id);// 设置点击外部是否可以取消bottomSheet.setCancelable(true);FrameLayout bottom = (FrameLayout)bottomSheet.findViewById(com.google.android.material.R.id.design_bottom_sheet);if (bottom != null) {// 设置背景透明颜色bottom.setBackgroundResource(R.color.transparent);// 修改弹窗的高度ViewGroup.LayoutParams layoutParams = bottom.getLayoutParams();layoutParams.height = height;bottom.setLayoutParams(layoutParams);}return bottomSheet;}/*** dp转px*/private int dpToPx(Context context, float dp) {return (int)(dp * context.getResources().getDisplayMetrics().density + 0.5);}/*** 显示*/public void show() {bottomDialog.show();}/*** 设置选中年份** @param yearValue 年*/public void setYearValue(int yearValue) {year.setValue(yearValue);updateNumberOfDays();}/*** 设置选中月份** @param monthValue 月*/public void setMonthValue(int monthValue) {month.setValue(monthValue);updateNumberOfDays();}/*** 设置选中天数** @param dayValue 天*/public void setDayValue(int dayValue) {day.setValue(dayValue);}/*** 更新天数**/private void updateNumberOfDays() {Calendar calendar = Calendar.getInstance();calendar.set(Calendar.YEAR, year.getValue());calendar.set(Calendar.MONTH, (month.getValue() - 1));calendar.set(Calendar.DATE, 1);calendar.roll(Calendar.DATE, -1);int date = calendar.get(Calendar.DATE);day.setMaxValue(date);day.setDisplayedValues(getNewDays(date));}/*** 格式化天数** @param days 天数* @return {@link String[]}*/private String[] getNewDays(int days) {List<String> dayList = new ArrayList<>();for (int i = 0; i < days; i++) {dayList.add((i + 1) + "日");}return dayList.toArray(new String[dayList.size()]);}}

对应view_time_picker.xml布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"android:background="@drawable/bg_bottom_dialog"><TextViewandroid:id="@+id/cancel"android:layout_width="wrap_content"android:layout_height="40dp"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintBottom_toTopOf="@id/year"android:gravity="center"android:text="取消"android:textColor="#666666"android:clickable="true"android:focusable="true" /><TextViewandroid:id="@+id/title"android:layout_width="0dp"android:layout_height="40dp"app:layout_constraintTop_toTopOf="parent"app:layout_constraintLeft_toRightOf="@id/cancel"app:layout_constraintBottom_toTopOf="@id/year"app:layout_constraintRight_toLeftOf="@id/ok"android:gravity="center"android:text="出生日期"android:textColor="#333333"android:textStyle="bold" /><TextViewandroid:id="@+id/ok"android:layout_width="wrap_content"android:layout_height="40dp"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toTopOf="@id/year"android:gravity="center"android:text="确定"android:textColor="#1580C8"android:textStyle="bold"android:clickable="true"android:focusable="true" /><com.shawnlin.numberpicker.NumberPickerandroid:id="@+id/year"android:layout_width="0dp"android:layout_height="0dp"app:layout_constraintTop_toBottomOf="@id/title"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toLeftOf="@id/month"app:np_formatter="%d"app:np_dividerColor="#2B000000"app:np_dividerThickness="1px"app:np_selectedTextColor="#333333"app:np_selectedTextSize="18sp"app:np_textSize="14sp"app:np_wheelItemCount="5"app:np_wrapSelectorWheel="false" /><com.shawnlin.numberpicker.NumberPickerandroid:id="@+id/month"android:layout_width="0dp"android:layout_height="0dp"app:layout_constraintTop_toBottomOf="@id/title"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toRightOf="@id/year"app:layout_constraintRight_toLeftOf="@id/day"app:np_dividerColor="#2B000000"app:np_dividerThickness="1px"app:np_selectedTextColor="#333333"app:np_selectedTextSize="18sp"app:np_textSize="14sp"app:np_wheelItemCount="5"app:np_wrapSelectorWheel="false" /><com.shawnlin.numberpicker.NumberPickerandroid:id="@+id/day"android:layout_width="0dp"android:layout_height="0dp"app:layout_constraintTop_toBottomOf="@id/title"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toRightOf="@id/month"app:layout_constraintRight_toRightOf="parent"app:np_dividerColor="#2B000000"app:np_dividerThickness="1px"app:np_selectedTextColor="#333333"app:np_selectedTextSize="18sp"app:np_textSize="14sp"app:np_wheelItemCount="5"app:np_wrapSelectorWheel="false" /></androidx.constraintlayout.widget.ConstraintLayout>

用法

在Mactivity或者Fragment直接调用

TimePickerCustom timePickerCustom = new TimePickerCustom(PersonalInfoActivity.this, "时间选择", (year, month, day) -> {Log.i("timePickerCustom", year + "------" + month + "--------" + day);Message msg = new Message();msg.what = 2;msg.obj = year+"/" + month + "/" + day;handler.sendMessage(msg);});timePickerCustom.show();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STL】迭代器iterator详解

前言 本篇文章以对string的操作来演示迭代器的操作。 一、什么是迭代器iterator&#xff1f; 迭代器&#xff08;iterator&#xff09;是一种可以遍历容器元素的数据类型。迭代器是一个变量&#xff0c;相当于容器和操纵容器的算法之间的中介。C迭代器是一种用于遍历容器中元的…

pta L1-062 幸运彩票

L1-062 幸运彩票 分数 15 全屏浏览 切换布局 作者 陈越 单位 浙江大学 彩票的号码有 6 位数字&#xff0c;若一张彩票的前 3 位上的数之和等于后 3 位上的数之和&#xff0c;则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。 输入格式&#xff1a; 输入在第…

力扣-删除排序链表中的重复元素II

题目 82-删除排序链表中的重复元素II 思路 因为题目中链表是已排序的且重复的节点是挨着的&#xff0c;因此通过一次遍历就可解决改题。同时注意到重复节点可能出现在表头&#xff0c;因此可以在表头新加一个虚拟节点&#xff08;这是一个处理链表问题时较常用的方法&#x…

DRF请求与响应的控制解析方式

DRF请求与响应的控制解析方式 目录 DRF请求与响应的控制解析方式请求&#xff08;Request&#xff09;控制解析格式 响应&#xff08;Response&#xff09;控制解析格式 请求&#xff08;Request&#xff09; DRF的Request类重写了原先Django的request&#xff0c;它比原先多了…

深入理解瑞芯微(Rockchip)VENDOR_STORAGE

序&#xff1a; 在嵌入式开发中&#xff0c;特别是在使用瑞芯微&#xff08;Rockchip&#xff09;系列ARM处理器时&#xff0c;经常会遇到需要在不更改系统固件&#xff08;如Android固件&#xff09;的情况下&#xff0c;存储设备特定的信息&#xff0c;如设备序列号、校准参…

火车头采集一键发布到Zblog

火车头采集发布到Zblog系统&#xff0c;主要操作步骤如下&#xff1a; 目录 1、Zblog火车头Web发布模块 2、内容发布参数映射&#xff0c;火车头发布到Zblog 3、简数一键发布到Zblog方法 1、Zblog火车头Web发布模块 自行编写Zblog火车头Web发布模块&#xff0c;一般要使用f…

ELK之Filebeat实用配置及批量部署(部署200+可用)

跟我之前Zabbix-agent批量部署脚本Linux and Windows&#xff08;部署300可用&#xff09;文章的套路一样&#xff0c;在使用该脚本前&#xff0c;请先准备好安装包及配置好安装包的资源下载点&#xff0c;由于我这边是纯内网&#xff0c;所以我就找了一个NAS做了共享目录&…

docker最新版安装

docker安装 检查系统版本即卸载旧docker安装docker依赖工具及底层依赖、仓库源安装dockerdocker阿里云镜像资源站参考 检查系统版本即卸载旧docker # 查看操作系统的发行版号 uname -r# 查看系统版本 cat /etc/redhat-release# 卸载旧版本docker(如已安装过) yum remove docke…

突破编程_前端_SVG(ellipse 椭圆形)

1 ellipse 元素的基本属性和用法 ellipse 元素用于创建椭圆形状。它具有一系列的基本属性&#xff0c;允许自定义椭圆的外观和位置。以下是一些 ellipse 元素的基本属性和用法&#xff1a; &#xff08;1&#xff09;基本属性 cx 和 cy&#xff1a;这两个属性定义了椭圆中心…

[Java EE] 计算机工作原理与操作系统简明概要

1. 计算机工作原理 1.1 生活中常见的计算机 计算机分为通用计算机和专用计算机,计算机并不单单指的是电脑,还有我们平时使用的手机,ipad,智能手表等终端设备都是计算机.还有我们用户不常见的计算机,比如服务器. 还有许多嵌入式设备(针对特定场景定制的"专用计算机"…

Suno,属于音乐的ChatGPT时刻来临

AI绘画 AI视频我们见过了&#xff0c;现如今AI都能生成一首音乐&#xff0c;包括编曲&#xff0c;演唱&#xff0c;而且仅需几秒的时间便可创作出两分钟的完整歌曲 相信关注苏音的很大一部分都是从获取编曲或者混音插件来的&#xff0c;现如今AI却能帮你几秒生成曲子 今天就带…

Java面试 Day02

自我介绍和equals()有什么区别&#xff1f;String变量直接赋值和构造函数赋值比较相等吗&#xff1f;String一些方法&#xff1f;抽象类和接口有什么区别&#xff1f;Java容器有哪些&#xff1f;List、Set还有Map的区别&#xff1f;线程创建的方式&#xff1f;Runable和Callabl…

海外云手机怎么解决tiktok运营难题?

最近打算做TikTok的商家越来越多了&#xff0c;而做TikTok的第一步就面临如何养号、涨粉的困境&#xff0c;本文将介绍如何通过海外云手机轻松解决这些问题。 早期大家用的比较多的&#xff0c;是真机科学上网的方法。但是这种方法&#xff0c;需要自己搭建海外环境&#xff0c…

js面试---ES6

1、let、const、var的区别 块级作用域&#xff1a;let和const具有块级作用域&#xff0c;var不存在块级作用域。块级作用域解决了内层变量可能覆盖外层变量&#xff0c;以及用来计数的循环变量泄露为全局变量的问题。 变量提升&#xff1a;var存在变量提升&#xff0c;let和con…

网络篇09 | 运输层 udp

网络篇09 | 运输层 udp 01 简介UDP 是面向报文的 02 报文协议 01 简介 UDP 只在 IP 的数据报服务之上增加了一些功能&#xff1a;复用和分用、差错检测 UDP 的主要特点&#xff1a;无连接。发送数据之前不需要建立连接。 使用尽最大努力交付。即不保证可靠交付。 面向报文。…

DRF视图组件(2个视图基类、5个视图扩展类、9个视图子类、视图集和路由映射)

DRF视图组件(2个视图基类、5个视图扩展类、9个视图子类、视图集和路由映射) 目录 DRF视图组件(2个视图基类、5个视图扩展类、9个视图子类、视图集和路由映射)2个视图基类mixins的5个视图扩展类generics的9个视图子类视图集自定制返回格式自动生成路由(SimpleRouter)action装饰器…

【Java】Object类

目录 一、equals 方法 二、hashCode 方法 三、toString 方法 四、finalize 方法 一、equals 方法 只能判断引用类型默认判断的是地址是否相等&#xff0c;也就是判断两个对象是不是同一个对象子类中往往重写该方法&#xff0c;用于判断内容是否相等 public class Equals…

[lesson30]操作符重载的概念

操作符重载的概念 操作符重载 C中的重载能够扩展操作符的功能 操作符的重载以函数的方式进行 本质&#xff1a; 用特殊形式的函数扩展操作符的功能 通过operator关键字可以定义特殊的函数 operator的本质是通过函数重载操作符 语法&#xff1a; 可以将操作符重载函数定…

Android RecyclerView性能优化及Glide流畅加载图片丢帧率低的一种8宫格实现,Kotlin

Android RecyclerView性能优化及Glide流畅加载图片丢帧率低的一种8宫格实现&#xff0c;Kotlin <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_MEDIA_IMAGES&qu…

c# 服务创建

服务 创建服务 编写服务 可以对server1.cs重新命名&#xff0c;点击你的server按F7进入代码编辑模式&#xff0c;编写脚本 双击你的server.cs右击空白位置&#xff0c;添加安装程序&#xff0c;此时会生成“serviceInstaller1”及“serviceProcessInstaller1” 后续可以点击P…