【Android】安卓付款密码输入框、支付密码输入框
如图

代码部分:
public class PayPasswordDialog extends AppCompatDialogFragment {private String mPayPass = "";private String mTitle, mMoney;private final TextView[] mPayPassTextViewArray = new TextView[6];private List<Integer> mPayPassList;private PayPassDialogAdapter adapter;private RecyclerView mPayPassRecyclerView;private TextView tvTitle, tvMoney;private ImageView ivClose;public static PayPasswordDialog newInstance() {Bundle args = new Bundle();PayPasswordDialog fragment = new PayPasswordDialog();fragment.setArguments(args);return fragment;}@NonNull@Overridepublic Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {Dialog dialog = new Dialog(getActivity(), R.style.BottomDialogFragment);dialog.setContentView(R.layout.dialog_pay_pass);dialog.setCancelable(true);dialog.setCanceledOnTouchOutside(true);Window window = dialog.getWindow();if (window != null) {WindowManager.LayoutParams lp = window.getAttributes();lp.gravity = Gravity.BOTTOM;lp.width = WindowManager.LayoutParams.MATCH_PARENT;lp.height = WindowManager.LayoutParams.WRAP_CONTENT;window.setAttributes(lp);window.setBackgroundDrawableResource(android.R.color.transparent);}initView(dialog);return dialog;}private void initView(Dialog dialog) {mPayPassRecyclerView = dialog.findViewById(R.id.recycler_view);tvTitle = dialog.findViewById(R.id.tv_title);tvMoney = dialog.findViewById(R.id.tv_money);ivClose = dialog.findViewById(R.id.iv_close);mPayPassTextViewArray[0] = dialog.findViewById(R.id.tv_pass1);mPayPassTextViewArray[1] = dialog.findViewById(R.id.tv_pass2);mPayPassTextViewArray[2] = dialog.findViewById(R.id.tv_pass3);mPayPassTextViewArray[3] = dialog.findViewById(R.id.tv_pass4);mPayPassTextViewArray[4] = dialog.findViewById(R.id.tv_pass5);mPayPassTextViewArray[5] = dialog.findViewById(R.id.tv_pass6);initData();}private void initData(){if (!TextUtils.isEmpty(mMoney)){tvMoney.setText(mMoney);}if (!TextUtils.isEmpty(mTitle)){tvTitle.setText(mTitle);}mPayPassList = new ArrayList<>();for (int i = 1; i <= 9; i++) {mPayPassList.add(i);}mPayPassList.add(10);mPayPassList.add(0);mPayPassList.add(12);adapter = new PayPassDialogAdapter(mPayPassList, getContext());mPayPassRecyclerView.setAdapter(adapter);mPayPassRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3));mPayPassRecyclerView.addItemDecoration(new GridSpacingItemDecoration(3, dp2px(1), true));initListeners();}private void initListeners(){ivClose.setOnClickListener(v -> dismiss());adapter.setOnItemClickListener(position -> {if (position < 9 || position == 10){if (mPayPass.length() < 6){mPayPass += mPayPassList.get(position);mPayPassTextViewArray[mPayPass.length() - 1].setText("*");}if (mPayPass.length() == 6){if (onFinishPayClickListener != null){onFinishPayClickListener.onPassFinish(this, mPayPass);}}} else if (position == 11) {if(!mPayPass.isEmpty()){mPayPassTextViewArray[mPayPass.length()-1].setText("");//去掉界面*mPayPass = mPayPass.substring(0,mPayPass.length()-1);//删除一位}}});}public interface OnFinishPayClickListener{void onPassFinish(PayPasswordDialog dialog, String payPass);}private OnFinishPayClickListener onFinishPayClickListener;public PayPasswordDialog setOnFinishPayClickListener(OnFinishPayClickListener onFinishPayClickListener) {this.onFinishPayClickListener = onFinishPayClickListener;return this;}private int dp2px(int dp) {return (int) (getContext().getResources().getDisplayMetrics().density * dp + 0.5f);}public PayPasswordDialog setMoney(String mMoney) {this.mMoney = mMoney;return this;}public PayPasswordDialog setTitle(String mTitle) {this.mTitle = mTitle;return this;}
}
public class PayPassDialogAdapter extends RecyclerView.Adapter<PayPassDialogAdapter.ViewHolder> {private final List<Integer> mData;private final Context mContext;public PayPassDialogAdapter(List<Integer> data, Context context) {mData = data;mContext = context;}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(mContext).inflate(R.layout.item_pay_password, parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {Integer integer = mData.get(position);if (integer == 10){holder.iv_delete.setVisibility(View.GONE);holder.tv_num.setText("");holder.itemView.setBackgroundColor(Color.parseColor("#E1E5EA"));}else if (integer == 12){holder.iv_delete.setVisibility(View.VISIBLE);holder.tv_num.setText("");holder.itemView.setBackgroundColor(Color.parseColor("#E1E5EA"));}else {holder.iv_delete.setVisibility(View.GONE);holder.tv_num.setText(String.valueOf(integer));}holder.itemView.setOnClickListener(v -> {if (mOnItemClickListener != null){mOnItemClickListener.onItemClick(position);}});}public interface OnItemClickListener{void onItemClick(int position);}private OnItemClickListener mOnItemClickListener;public void setOnItemClickListener(OnItemClickListener onItemClickListener) {mOnItemClickListener = onItemClickListener;}@Overridepublic int getItemCount() {return mData == null ? 0 : mData.size();}public static class ViewHolder extends RecyclerView.ViewHolder {ImageView iv_delete;TextView tv_num;public ViewHolder(View view) {super(view);iv_delete = view.findViewById(R.id.iv_delete);tv_num = view.findViewById(R.id.tv_num);}}
}
源码:
gitee
github
相关文章:
【Android】安卓付款密码输入框、支付密码输入框
如图 代码部分: public class PayPasswordDialog extends AppCompatDialogFragment {private String mPayPass "";private String mTitle, mMoney;private final TextView[] mPayPassTextViewArray new TextView[6];private List<Integer> mPayP…...
Python异常处理:从入门到精通的实用指南
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
【AVL树】—— 我与C++的不解之缘(二十三)
什么是AVL树? AVL树发明者是G. M. Adelson-Velsky和E. M. Landis两个前苏联科学家,他们在1962年论文《An algorithm for the organization of information》中发表了AVL树。AVL树是最先发明的自平衡二叉搜索树,说白了就是能够自己控制平衡结构…...
用大白话解释日志处理Log4j 是什么 有什么用 怎么用
Log4j是什么? Log4j就像程序的“黑匣子”,专门用来记录软件运行时的各种信息,比如哪里报错、性能如何、用户操作轨迹等。它是Java领域最常用的日志框架之一,可以灵活控制日志内容、输出位置(控制台、文件、数据库等&a…...
无人机遥控器的亮度 和 两个工作频率
工作频率 2.4000-2.4835 GHz , 5.725-5.850 GHz 1.这是一个无人机的遥控器的两个工作频率,为什么会有两个工作频率? 无人机的遥控器采用双频段设计(2.4GHz 和 5.8GHz),主要是为了解决以下问题并优化性…...
【Linux】命令行参数 | 环境变量(四)
目录 前言: 一、命令行参数: 1.main函数参数 2.为什么有它? 二、环境变量: 1.main函数第三个参数 2.查看shell本身环境变量 3.PATH环境变量 4.修改PATH环境变量配置文件 5.HOME环境变量 6.SHELL环境变量 7.PWD环境变…...
算法002——复写零
力扣——复写零点击即可跳转 这道题还是运用 双指针,我们从左往右开始,让 cur 0,dest 0,当我们循环时,会覆盖后面的值,所以从左到右无法实现,我们运用 从右到左的方式。 以示例一数组为例,从…...
例子 DQN + CartPole: 深入思考一下,强化学习确实是一场智能冒险之旅!
强化学习的概念 在技术人员眼里,深度学习、强化学习,或者是大模型,都只是一些算法。无论是简单,还是复杂,我们都是平静的看待。当商业元素日益渗透进技术领域,人人言必称大模型的时候。技术人该反思一下&a…...
java 实现xxl-job定时任务自动注册到调度中心
xxl-job 自动注册(执行器和任务) 前言 xxl-job是一个功能强大、简单易用、高可用且可扩展性强的分布式定时任务框架/分布式任务调度平台。它适用于各种需要定时任务调度的场景,并可根据业务需求进行灵活配置和扩展。 xxl-job简介 xxl-job是一个开源的分布式定时任务框架,…...
esp32串口通信
1、线路图 2、打开电脑的串口终端 3、eps32通过串口往电脑的串口终端输出信息: from machine import UART, Pin import time# 初始化UART0,波特率设置为115200 uart UART(0, baudrate115200, tx1, rx3)# 主循环 while True:# 要发送的消息#某些串口终…...
蓝桥杯备赛-前缀和-可获得的最小取值
问题描述 妮妮学姐手头有一个长度为 nn 的数组 aa,她想进行 kk 次操作来取出数组中的元素。每次操作必须选择以下两种操作之一: 取出数组中的最大元素。取出数组中的最小元素和次小元素。 妮妮学姐希望在进行完 kk 次操作后,取出的数的和最…...
UniApp 中封装 HTTP 请求与 Token 管理(附Demo)
目录 1. 基本知识2. Demo3. 拓展 1. 基本知识 从实战代码中学习,上述实战代码来源:芋道源码/yudao-mall-uniapp 该代码中,通过自定义 request 函数对 HTTP 请求进行了统一管理,并且结合了 Token 认证机制 请求封装原理ÿ…...
边缘计算+多模态感知:户外监控核心技术解析与工程部署实践!户外摄像头监控哪种好?户外摄像头监控十大品牌!格行视精灵VS海康威视VS大华横评!
一、核心参数解析与选型逻辑 1.环境适应性设计 极端天气防护:优先选择IP66/67防护等级的设备,例如格行视精灵通过IP67防水防尘设计可应对暴雨、沙尘暴等复杂环境,其密封轴承结构可有效防止水汽侵蚀内部电路。 温度耐受范围:北方…...
Spring项目-抽奖系统(实操项目)(ONE)
^__^ (oo)\______ (__)\ )\/\ ||----w | || || 一:前言: 随着互联网技术的快速发展,线上营销活动已成为企业吸引用户、…...
STM32-智能小车项目
项目框图 ST-link接线 实物图: 正面: 反面: 相关内容 使用L9110S电机模块 电机驱动模块L9110S详解 | 良许嵌入式 测速模块 语音模块SU-03T 网站:智能公元/AI产品零代码平台 一、让小车动起来 新建文件夹智能小车项目 在里面…...
Python:字符串常见操作
find(子字符串,开始位置下标,结束位置下标) 注意:开始位置和结束位置下标可以省略,表示在整个字符串中查找 stasdfghjkl print(st.find(a))#输出结果为0,表明a在第一个位置默认从零开始,找不到则返回-1 …...
Redis 哈希(Hash)
Redis 哈希(Hash) 概述 Redis 哈希(Hash)是一种特殊的键值对类型,它允许存储结构化的数据,例如一个对象或记录。每个哈希值可以包含多个字段,每个字段又可以存储一个字符串值。这使得Redis哈希非常适合用于存储对象的…...
Windows对比MacOS
Windows对比MacOS 文章目录 Windows对比MacOS1-环境变量1-Windows添加环境变量示例步骤 1:打开环境变量设置窗口步骤 2:添加系统环境变量 2-Mac 系统添加环境变量示例步骤 1:打开终端步骤 2:编辑环境变量配置文件步骤 3࿱…...
react 路由跳转的几种方式
在 React 中,路由跳转通常通过 react-router-dom(或类似的路由库)来实现。以下是几种常见的路由跳转方式: 1. 使用 <Link> 组件 <Link> 是最简单的路由跳转方式,它会生成一个 <a> 标签,…...
2.你有什么绝活儿?—Java能做什么?
1、Java的绝活儿:要问Java有什么绝活,我觉得它应该算是一位魔法师,会的绝活儿有很多,要说最能拿得出手的当属以下三个。 1.1 平台无关性:Java可以在任何地方施展魔法,无论是Windows、Linux还是Mac…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
