Android原生时间控件DatePicker——月份由英文转数字

Android入门之路 - 原生DatePicker(日历) 今天本来是要做日期选择器的,不经意间遇到了DatePicker,也就是日历这样的Android原生控件,特此留念一下 ~ 阅读详情

网上有很多优秀的开源时间控件,可以满足我们大部分的需求。

但有时候还是会碰到系统自带的DatePicker,这个控件默认的月份显示为英文,如JANUARY、FEBRUARY等。

如何将月份由英文改成数字,这是个好玩的问题。

庖丁解牛

DatePicker并没有提供相关api可以实现我们的需求,所以需要我们自己来分析。

查看DatePicke的源码,它的布局文件是date_picker.xml,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_horizontal"
    android:orientation="horizontal"
    android:gravity="center">

    <LinearLayout android:id="@+id/pickers"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:gravity="center">

        <!-- Month -->
        <NumberPicker
            android:id="@+id/month"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="1dip"
            android:layout_marginEnd="1dip"
            android:focusable="true"
            android:focusableInTouchMode="true"
            />

        <!-- Day -->
        <NumberPicker
            android:id="@+id/day"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="1dip"
            android:layout_marginEnd="1dip"
            android:focusable="true"
            android:focusableInTouchMode="true"
            />

        <!-- Year -->
        <NumberPicker
            android:id="@+id/year"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="1dip"
            android:layout_marginEnd="1dip"
            android:focusable="true"
            android:focusableInTouchMode="true"
            />

    </LinearLayout>

    <!-- calendar view -->
    <CalendarView
        android:id="@+id/calendar_view"
        android:layout_width="245dip"
        android:layout_height="280dip"
        android:layout_marginStart="44dip"
        android:layout_weight="1"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:visibility="gone"
        />

</LinearLayout>

可以很轻松地发现,月份就是一个id为month的NumberPicker控件。

在DatePicker中以month控件为线索,很快发现NumberPicker下的这个方法:

    /**
     * Sets the values to be displayed.
     *
     * @param displayedValues The displayed values.
     */
    public void setDisplayedValues(String[] displayedValues) {
        ...
        ...
        ...
    }

该方法参数为一个String数组,该数组每一项就是展示的月份数据。

所以如果我们自己调用该方法,传入以数字表示的月份,就达到目的啦!

寻找调用时机

在DatePicker源码中,直接调用setDisplayedValues方法的地方有两处,

一处是在构造函数中:

public DatePicker(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        ......

        OnValueChangeListener onChangeListener = new OnValueChangeListener() {
            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
               ......
                updateSpinners();
                updateCalendarView();
                notifyDateChanged();
            }
        };

       ......

        // month
        mMonthSpinner = (NumberPicker) findViewById(R.id.month);
        mMonthSpinner.setMinValue(0);
        mMonthSpinner.setMaxValue(mNumberOfMonths - 1);
        mMonthSpinner.setDisplayedValues(mShortMonths);
        mMonthSpinner.setOnLongPressUpdateInterval(200);
        mMonthSpinner.setOnValueChangedListener(onChangeListener);
        mMonthSpinnerInput =(EditText)mMonthSpinner.findViewById(R.id.numberpicker_input);

        ......
}

mShortMonths就是默认的英文月份,就不展开介绍了。

构造函数中在第X行调用了setDisplayedValues方法,完成了展示月份数据的设置。

同时mMonthSpinner的值监听器为onChangeListener,当月份变化时会回调onValueChange方法,该方法中又会调用updateSpinners方法,这是另一处直接调用setDisplayedValues方法的地方:

private void updateSpinners() {
      ......

        // make sure the month names are a zero based array
        // with the months in the month spinner
        String[] displayedValues = Arrays.copyOfRange(mShortMonths,
                mMonthSpinner.getMinValue(), mMonthSpinner.getMaxValue() + 1);
        mMonthSpinner.setDisplayedValues(displayedValues);

      ......
    }

而updateSpinners方法除了会在上述的监听器中被调用,还要其他方法中也会调用,例如:

    /**
     * Initialize the state. If the provided values designate an inconsistent
     * date the values are normalized before updating the spinners.
     *
     * @param year The initial year.
     * @param monthOfYear The initial month <strong>starting from zero</strong>.
     * @param dayOfMonth The initial day of the month.
     * @param onDateChangedListener How user is notified date is changed by
     *            user, can be null.
     */
    public void init(int year, int monthOfYear, int dayOfMonth,
            OnDateChangedListener onDateChangedListener) {
        setDate(year, monthOfYear, dayOfMonth);
        updateSpinners();
        updateCalendarView();
        mOnDateChangedListener = onDateChangedListener;
    }

        /**
     * Sets the maximal date supported by this {@link DatePicker} in
     * milliseconds since January 1, 1970 00:00:00 in
     * {@link TimeZone#getDefault()} time zone.
     *
     * @param maxDate The maximal supported date.
     */
    public void setMaxDate(long maxDate) {
        mTempDate.setTimeInMillis(maxDate);
        if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR)
                && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) {
            return;
        }
        mMaxDate.setTimeInMillis(maxDate);
        mCalendarView.setMaxDate(maxDate);
        if (mCurrentDate.after(mMaxDate)) {
            mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
            updateCalendarView();
        }
        updateSpinners();
    }

以上所有直接或间接调用setDisplayedValues方法的地方都会将月份重置为英文显示,所以我们自己调用setDisplayedValues方法的时机就是在这些方法被调用之后。

也就是说,我们的调用时机在DatePicker构造函数之后、init()、setMaxDate()等方法之后和onDateChanged()方法之中。

轻松实现

知道了在何时调用何方法后,我们来具体实现这一需求。

首先准备好展示的月份数组:

String months[] = {"1月", "2月", "3月", "4月", "5月", "6月",
            "7月", "8月", "9月", "10月", "11月", "12月"};

假设mDatePicker就是目标DatePicker控件,因为DatePicker没有提供可以获取到月份控件的api,所以需要自己想办法获取到月份控件,再调用它的setDisplayedValues方法。

分析之前的date_picker.xml文件,可以写出下面这行代码:

((NumberPicker) ((ViewGroup) ((ViewGroup) mDatePicker.getChildAt(0)).getChildAt(0)).getChildAt(0)).setDisplayedValues(months);

通过调用这行代码,就实现了替换掉英文月份的目标!

设置 DatePicker 中文显示 NULL 博文链接:https://flyer0126.iteye.com/blog/743449 立即下载

相关推荐

如何使你的直流电机闭环?(PID讲解)

看了看很多大佬写的PID讲解很全面也很复杂,实在是不适合很多萌新入坑,所以想按自己的理解写一篇通俗易懂的PID算法讲解

a2001444的博客 1万+

将Android中DatePickerDialog中月份的中文变成数字

在写DatePickerDialog的时候经常会出现月份是中文(或者是英文字母)的情况,如下图,这时候可恶的老板却总是要求必须要数字显示,废话不多说,直接上代码。 public class NewDatePicker extends DatePickerDialog {      priva

Ham&Bean 6842

从气象预报到物流规划:多尺度地理加权回归(MGWR)在ArcGIS Pro中的实战应用

本文深入探讨了多尺度地理加权回归(MGWR)在ArcGIS Pro中的实战应用。通过对比传统GWR模型,MGWR的核心优势在于能识别不同解释变量的独特空间作用尺度,有效解决空间异质性问题。文章结合气象预报误差修正与物流网点选址两个案例,详细讲解了从数据准备、参数设置、带宽优化到结果解读的全流程,为地理数据分析师处理复杂空间数据提供了强大工具。

egg99的博客 1032

Android DatePicker spinner 年、月、日数字格式设置

需求: 使用DatePicker 做个时间选择器,但是日期小于10的时候,显示为01,02,03…,要求去掉前面的0; 实现: 下面实现了日期的格式设置,同理可以获取年、月的NumberPicker,然后设置format。 private void setPickerStyle(DatePicker datePicker) { Resources mResources = mContext.getResources(); int id = mResources.getIdentif

孔小乐的博客 3405

关于海康网络摄像头使用VLC或者Opencv拉流有延迟的问题

先说结论,我用VLC或者Pyhton opencv直接拉取海康网络摄像头的rtsp流,会有1-2s延时,特别明显。环境:Windows + VLC / Openc-Python。如上面文章介绍,我使用的时候遇到一处错误,需要把代码中的。海康SDK:与网页视频相比,几乎是同步的。上面说的延时,也是与摄像头网页视频相比的。ffplay 去掉缓存:延时1s左右。这两处地方改成左斜杠,才能运行。opencv拉流使用的是。多线程:延时1s左右。

yljxh的博客 4500

基于STM32设计的智能家居控制系统(华为云)_363

本项目设计并实现了一种基于STM32的智能家居控制系统,融合了语音识别、远程控制、环境监测与安全报警等功能。系统以STM32F103C8T6单片机为核心控制器,集成ESP8266 Wi-Fi模块实现与华为云IOT物联网平台的数据交互,采用MQTT协议进行通信。用户可通过语音识别模块控制风扇、空调、窗帘、卧室灯、客厅灯和电视等家电的开关操作,同时也可通过Android手机APP或Windows电脑上位机进行远程控制。系统还具备温湿度、光照强度、烟雾浓度和火焰检测功能,当检测到异常情况时,自动触发蜂鸣器报警并向

882

DatePickerDialog的月份为英文转成数字

DatePickerDialog的月份为英文转成数字

zuohenghengl的博客 5413

一步到位解决Docker拉取镜像失败的问题!超详细的Docker代理设置教程!(使用代理解决群晖Docker获取注册表失败的问题)

一步到位解决Docker拉取镜像失败的问题!超详细的Docker代理设置教程!(使用代理解决群晖Docker获取注册表失败的问题)

XiaoqiangClub的博客 1万+

Numberpicker 数组角标越界问题

由于近期项目中要是用三级联动,所以选择了Numberpicker来做。但是做到一半发现numberpicker老是出现数组角标越界问题。经过查找资料总有解决了,废话到此!下面看结局方法! 解决方案一  1、当前NumberPicker的最大值大于数组大小时,先setMaxValue再setDisplayedValues。  2、当前NumberPicker的最大值小于数组大小时,

zhangyalong_android的博客 2521

AI驱动的客户终身价值分析:深入理解公司的收入质量

客户终身价值(Customer Lifetime Value, CLV)是衡量客户在整个生命周期内能为企业带来多少利润的重要指标。传统的CLV计算方法往往过于简化,无法准确反映复杂的客户行为和收入模式。本文旨在介绍如何利用人工智能技术,特别是机器学习方法,构建更精确的CLV预测模型,从而帮助企业深入理解其收入质量。CLV的基本概念和商业意义传统CLV计算方法的局限性基于机器学习的CLV预测方法特征工程和模型选择策略实际应用案例和Python实现首先介绍CLV的基本概念和商业背景。

AI云原生与云计算技术学院 477

手把手带你死磕ORBSLAM3源代码(一)目录详解

ORB-SLAM3是一种基于特征点的稀疏实时单目SLAM(Simultaneous Localization and Mapping)系统。它是ORB-SLAM系列模型的第三代版本,用于在无人机、机器人和增强现实等领域中进行实时定位和建图。ORB-SLAM3使用了一种特征点提取和描述算法,称为ORB(Oriented FAST and Rotated BRIEF)。该算法能够提取图像中的稳定特征,并将其用于地图建立和相机定位。

anananajiushiwo的博客 2301

日期时间选择器实战:AndroidPicker DatePicker与TimePicker详解

本文全面解析了AndroidPicker库中DatePicker、TimePicker和DatimePicker三大核心组件的功能特性与实战应用。详细介绍了DatePicker的多种日期模式(年月日、年月、月日)、灵活的日期范围配置、标签自定义、格式化器实现以及联动行为控制;深入探讨了TimePicker对12/24小时制的完整支持机制,包括时间模式枚举、AM/PM智能处理和国际标准化实现;系统阐...

gitblog_00621的博客 643

【RT-DETR实战】159、改进九:知识蒸馏从YOLOv8教师模型学习

摘要: 本文探讨了知识蒸馏在RT-DETR目标检测模型中的应用挑战与实践经验。作者以YOLOv8作为教师模型,针对特征对齐、损失函数设计和训练策略等核心问题,提出了适配器模块、动态权重调整和多阶段训练等优化方案。文章重点分析了教师模型选择、特征图匹配、损失函数组合等关键环节的实战技巧,并总结了蒸馏模型部署时的注意事项。通过实验验证,作者指出知识蒸馏应关注模型"思维方式"的迁移而非简单特征复制,并强调合理评估指标和教师模型选择的重要性。最后,作者分享了技术迭代中的边际效应认知,为工业场景下的模型优化提供了实用

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 268

安卓日历Calendar和DatePicker日期选择器的使用

一、Calendar的使用 Calendar 该控件可以获得日期和时间,可以获取当前的,也可以根据当前日期加减年月日时分秒。 比如想做一个类似这样的东西,只使用Calendar 就够了。 1:获取年、月、日、周、时、分、秒 private Calendar calendar; //定义一个全局的 private int year; //年 private int month; //月 private int day; //日

weixin_51022898的博客 1296

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android 开源项目分类汇总指南:android-open-project 五大板块全景索引与选型参考

本文以开源仓库 android-open-project 的中文主文档 [README.zh.md](https://link.gitcode.com/i/f4fe4b84277f82d3a0a351eeb57caad2) 为骨架,系统梳理其收录的 Android 开源项目全景:从个性化控件(View)到常用工具库,从完整优秀项目到开发/测试工具,再到值得关注的优秀个人与组织。阅读本文后,你将获得

gitblog_01128的博客 467

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android 自定义 datepickerdialog,Android最简单方式实现DatePickerDialog只显示年、月、日...

项目刚好有这个需求,上网查了下。有个例子还比较简单。自定义实现DatePickerDialog,然后通过反射机制隐藏里面的控件。不过这还不是最方便的,毕竟还要不同的控件代码,XML代码。直接拿到核心代码,简单丰富一下。直接调用就可以隐藏日,月选择了。调用代码:dateDialog=newDatePickerDialog(getActivity(),listener,year,monthO...

weixin_42197841的博客 600

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android学习-使用DatePicker以及TimePicker显示当前日期和时间

OnDateChangedListener()和OnTimeChangedListener() 1>当用户更改了DatePicker里的年、月、日时,将触发OnDateChangedListener监听器的OnDateChange事件 2>当用户更改了TimePicker里的时、分时,将触发OnTimeChangedListener监听器的onTimeChanged事件OnDateSetList

海向的博客 6880

andriod studio TextClock 时间格式备忘

<TextClock android:layout_width="wrap_content" android:layout_height="wrap_content" android:format12Hour="yyyy年MM月dd日 EEEE aa HH:mm:ss" android:format24Hour="yyyy年MM月dd日 EEEE aa HH:mm:ss" /> 安卓4.2以后的版本才可以使用Text.

kim5659的博客 1182

Antd中RangePicker组件弹出的日历中英混杂,月份和周显示为英问题

解决Antd中RangePicker组件弹出的日历中英混杂,月份和周显示为英问题

Mqyyy的博客 5448

Android开发--DatePicker(日期设置,年月日设置)

一、源代码package com.wyt.Android_DatePicker;import android.app.Activity;import android.app.DatePickerDialog;import android.app.Dialog;import and

wendy_Remax山窝窝 2万+

android 修改自带DatePickerDialog的“设置”、“取消”

最近使用DatePickerDialog日期控件,由于需要显示英文,但其自带的是“设置”  ”取消“, 解决方法如下 public class MyDatePickerDialog extends DatePickerDialog{     public MyDatePickerDialog(Context context, int theme,             OnDateSe

xu_love_tao的专栏 1460

datetimepicker控件的月份一直显示的是英文,怎样修改为数字呢?

F12 看一下,发现文件中缺少中文选项,把中文选项添加进去就好了,如果想懒省事,就重新下载插件了。红框就是添加的内容,注意前面的逗号。如果还不能解决,请给我留言。 ch: { days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], daysShort: ["周日", "周一", "周二", "周三...

fulong0406的博客 2622

关于安卓自定义地址选择控件的实现

关于安卓自定义地址选择控件的实现

motosheep的博客 906

android 选择年月日控件(DatePick简单好用)

activity_date.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" andro.

xiyangyang8110的博客 1910

DateTimePicker控件中自定义时间格式

在DateTimePicker中把Format 选择为Cutstom,然后在CutstomFormat写入格式字符串,介绍如下:     如何你显示10:05 Am,则写成:HH:mm tt(区分大小写),要显示包含日期和时间分隔符的字符串或格式字符串,则必须在子字符串中使用转义符。例如,若要将日期显示为"June 06 at 3:00 PM",请将 CustomFormat 属性设置为"MMM

李达 5772
上一篇: 【源码分析】Android触摸事件的分发拦截
下一篇: 神奇的Python装饰器
binaryshao
博客等级 码龄11年 52粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值