如何屏蔽 EditText 以显示 dd/mm/yyyy 日期格式

2024-01-16

我怎样才能格式化EditText遵循“dd/mm/yyyy“ 格式化的方式与我们使用 a 格式化的方式相同TextWatcher to mask用户输入看起来像“0.05€”。我不是在谈论限制字符或验证日期,只是屏蔽到以前的格式。


我写了这个TextWatcher对于一个项目,希望对某人有帮助。请注意,它确实not验证用户输入的日期,并且您应该在焦点更改时处理该问题,因为用户可能尚未完成输入日期。

更新 25/06将其设为 wiki,看看我们是否能得到更好的最终代码。

更新07/06我最终为观察者本身添加了某种验证。它将对无效日期执行以下操作:

  • 如果月份大于 12,则为 12(12 月)
  • 如果该日期大于所选月份的日期,请将其设为该月的最大值。
  • 如果年份不在范围内1900-2100,将其更改为范围内

此验证符合我的需求,但你们中的一些人可能想稍微更改一下,范围很容易更改,您可以将此验证挂钩到Toast例如,消息通知用户我们已经修改了他/她的日期,因为它是无效的。

在这段代码中,我假设我们引用了我们的EditText called date有这个TextWatcher附加到它,可以这样做:

EditText date;
date = (EditText)findViewById(R.id.whichdate);
date.addTextChangedListener(tw);

TextWatcher tw = new TextWatcher() {
    private String current = "";
    private String ddmmyyyy = "DDMMYYYY";
    private Calendar cal = Calendar.getInstance();

当用户更改文本时EditText

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (!s.toString().equals(current)) {
            String clean = s.toString().replaceAll("[^\\d.]|\\.", "");
            String cleanC = current.replaceAll("[^\\d.]|\\.", "");

            int cl = clean.length();
            int sel = cl;
            for (int i = 2; i <= cl && i < 6; i += 2) {
                sel++;
            }
            //Fix for pressing delete next to a forward slash
            if (clean.equals(cleanC)) sel--;

            if (clean.length() < 8){
               clean = clean + ddmmyyyy.substring(clean.length());
            }else{
               //This part makes sure that when we finish entering numbers
               //the date is correct, fixing it otherwise
               int day  = Integer.parseInt(clean.substring(0,2));
               int mon  = Integer.parseInt(clean.substring(2,4));
               int year = Integer.parseInt(clean.substring(4,8));

               mon = mon < 1 ? 1 : mon > 12 ? 12 : mon;
               cal.set(Calendar.MONTH, mon-1);
               year = (year<1900)?1900:(year>2100)?2100:year;
               cal.set(Calendar.YEAR, year); 
               // ^ first set year for the line below to work correctly
               //with leap years - otherwise, date e.g. 29/02/2012
               //would be automatically corrected to 28/02/2012 

               day = (day > cal.getActualMaximum(Calendar.DATE))? cal.getActualMaximum(Calendar.DATE):day;
               clean = String.format("%02d%02d%02d",day, mon, year);
            }

            clean = String.format("%s/%s/%s", clean.substring(0, 2),
                clean.substring(2, 4),
                clean.substring(4, 8));

            sel = sel < 0 ? 0 : sel;
            current = clean;
            date.setText(current);
            date.setSelection(sel < current.length() ? sel : current.length());
        }
    }

我们还实现了其他两个函数,因为我们必须

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void afterTextChanged(Editable s) {}
};

这会产生以下效果,删除或插入字符将显示或隐藏dd/mm/yyyy面具。它应该很容易修改以适应其他格式掩码,因为我试图让代码尽可能简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何屏蔽 EditText 以显示 dd/mm/yyyy 日期格式 的相关文章

随机推荐

  • 在 Fabric8 Kubernetes 客户端 events() API 的 Watcher 中,我可以监视哪些资源?

    我正在探索 无证 events API https github com fabric8io kubernetes client blob master kubernetes client src main java io fabric8
  • Qt 中区分单击事件和双击事件

    我有一个QAbstractItemView需要对单击和双击事件做出反应 根据单击还是双击 操作会有所不同 发生的问题是在双击事件之前接收到单击事件 是否有推荐的方法 最佳实践来区分两者 当用户实际双击时 我不想执行单击操作 我正在使用 Qt
  • 在内联表单集中使用 Django FileField

    在我的应用程序中上传文件时遇到问题 用户提交报告并可以添加附件 通过外键关系 我已经显示了内联表单 如果我将其留空 它就会工作 但是当我尝试上传文件然后提交表单时 我收到 500 错误 基本报告已制作 但内联的附件未保存 forms py
  • 如何调用Fragment的onResume()

    我使用了导航抽屉 其中有许多片段 我想调用fragment的onResume 我需要从服务器加载更新的数据 onResume 当你的Activity onResume 已被调用 您不必调用onResume in a Fragment 阅读本
  • Python 编码风格 - 多个返回语句[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 对于同一任务 我编写了两个不同的函数 我想知道哪一个使用起来更优雅 任务是检查一个pydot如果它看到请求的节点 则返回对象 如果是 则返回该节
  • 让 google Recaptcha 能够处理域名中的特殊字符

    我正在为域名中包含瑞典字符 的网站设置 API 密钥 http s lja io http s C3 A4lja io 但它没有初始化验证码 然后尝试使用等效 url 的 api 密钥http xn slja loa io http xn
  • android studio 模拟器无法初始化 DirectSoundCapture

    我在 android studio 3 2 中只有一个基本的 helloworld 应用程序 我正在尝试运行一些模拟器来使用 AVD 管理器测试该应用程序 但模拟器只是停留在 google 徽标中 最终 android studio 超时并
  • Android Studio 2 Beta 5 中的构建变体中测试工件选择器丢失/消失

    为了在 Android Studio 中运行 Instrumentation Tests 我通常通过 Build Variants 窗 口选择 Android Instrumentation Tests 作为要构建的测试工件 我最近升级到
  • 注入存储库上的 IDisposable

    我有以下 ADO Net 存储库 public class Repository IRepository IDisposable private readonly IUnitOfWork UnitOfWork private SqlConn
  • 使用 Ext.grid.Panel.reconfigure() 破坏网格 RowEditing 插件

    我正在创建一个 extjs 网格面板 其中有一组用户可配置的列 这Ext grid Panel http docs sencha com ext js 4 1 api Ext grid Panel组件提供了一个方便的reconfigure
  • 如何将卫星程序集(本地化资源)包含在使用 WiX 构建的 MSI 中?

    我正在从事的项目正在从使用 VS2008 部署 安装程序切换到 WiX 我目前对 WiX 还很陌生 我添加了将资源项目的输出复制到 Resources dll 中的代码 但在旧的 VS2008 安装程序文件系统中 还存在本地化资源输出 该输
  • 调用 mouseClicked() 后 JComponent 消失

    我正在用 Swing 编写一个 Java GUI 程序 界面如下所示 当用户单击右侧的其中一张图片时 我希望在左上角的橙色区域中显示它的小预览 我通过以下方式从计算机上的目录中提取所有图像文件SwingWorker线程 http docs
  • 无法打开登录请求的服务器

    我正在尝试使用 pyodbc 连接到我的 Azure SQL 数据库 我正在使用的azure帐户位于用户名下 电子邮件受保护 cdn cgi l email protection 我的大学帐户 当我尝试连接到数据库时 出现错误 Cannot
  • 如何在轮子中包含和安装测试文件并部署到 Databricks

    我正在开发一些在 Databricks 上运行的代码 鉴于 Databricks 无法在本地运行 我需要在 Databricks 集群上运行单元测试 问题是当我安装包含我的文件的轮子时 测试文件永远不会安装 如何安装测试文件 理想情况下我想
  • 如何在使用 VS Code 调试之前执行批处理文件

    我正在使用 Typescript nodeJS 和 VS Code 进行开发 使用 VS Code 进行调试 我的配置中有launch json type node request launch name Launch via NPM ru
  • 如何在 WPF ListView 中查看最后添加的列表视图项

    我正在使用视图模型绑定到列表视图 每次我在视图模型内部可观察集合中添加一个项目时 我都会使用 list Count 1 触发 LastIndex 属性 列表视图绑定到 VM 的 LastIndex 属性 并且列表视图正确选择添加到视图的最后
  • Typescript getter 和 setter 错误

    好吧 这是我第一天使用 typescript 做一些 Angular 2 我尝试制作一个简单的 getter 和 setter 服务 import Injectable from angular2 core Injectable expor
  • JPA:请帮助理解“join fetch”

    我有以下实体结构 业务 gt 营销活动 gt 促销 其中一个业务可以有许多营销活动 一个营销活动可以有许多促销活动 两个一对多关系都被声明为 LAZY 在我的代码中的一处 我需要急切地从 Business 中获取这两个集合 所以我这样做 Q
  • 在 data.table 中动态创建过滤表达式 (i)

    有一个data table library data table dd lt data table x 1 10 y 10 1 z 20 20 我可以使用过滤它 dd x in c 1 3 z in c 12 20 x y z 1 1 10
  • 如何屏蔽 EditText 以显示 dd/mm/yyyy 日期格式

    我怎样才能格式化EditText遵循 dd mm yyyy 格式化的方式与我们使用 a 格式化的方式相同TextWatcher to mask用户输入看起来像 0 05 我不是在谈论限制字符或验证日期 只是屏蔽到以前的格式 我写了这个Tex