【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

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

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

相关文章

Java数据结构_一篇文章了解常用排序_8.1

本文所有排序举例均默认为升序排列。 目录 1. 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想&#xff1a; 2.1.2 直接插入排序 2.1.3 希尔排序&#xff08;缩小增量排序&#xff09; 2.2 选择排序 2.2.1 基本思想&#xff1a; 2.2.2 直接选择排…

性能调优篇——索引优化与执行计划解析

引言 当数据库表数据突破千万级时&#xff0c;一个未优化的索引可能让查询耗时从毫秒级暴增至分钟级。某电商平台曾因商品搜索接口的索引缺失&#xff0c;导致大促期间数据库CPU飙升至98%&#xff0c;直接引发服务雪崩。本文将深入B树索引的存储奥秘&#xff0c;详解慢查询日志…

计算机毕业设计SpringBoot+Vue.js人口老龄化社区服务与管理平台 (源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

C#上位机--三元运算符

引言 在 C# 上位机开发中&#xff0c;我们经常需要根据不同的条件来执行不同的操作。条件判断是编程中不可或缺的一部分&#xff0c;而三元运算符就是一种简洁而强大的条件判断工具。本文将详细介绍 C# 中的三元运算符&#xff0c;探讨其在上位机开发中的应用场景&#xff0c;…

AI时代保护自己的隐私

人工智能最重要的就是数据&#xff0c;让我们面对现实&#xff0c;大多数人都不知道他们每天要向人工智能提供多少数据。你输入的每条聊天记录&#xff0c;你发出的每条语音命令&#xff0c;人工智能生成的每张图片、电子邮件和文本。我建设了一个网站(haptool.com)&#xff0c…

Hutool - POI:让 Excel 与 Word 操作变得轻而易举

各位开发者们&#xff0c;在日常的 Java 开发工作里&#xff0c;处理 Excel 和 Word 文件是相当常见的需求。无论是从 Excel 里读取数据进行分析&#xff0c;还是将数据写入 Excel 生成报表&#xff0c;亦或是对 Word 文档进行内容编辑&#xff0c;传统的 Apache POI 库虽然功能…

数据库操作命令详解:CREATE、ALTER、DROP 的使用与实践

引言​ 数据库是存储和管理数据的核心工具&#xff0c;而 ​DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09;​​ 是构建和调整数据库结构的基石。本文将通过实际示例&#xff0c;详细讲解 CREATE&#xff08;创建&#xff09;、ALTER&#xff0…

Asp.Net Core WebAPI开发教程(入门)

一、Asp.Net Core WebAPI项目创建 二、Asp.Net Core WebApi/Mvc路由定义 二、Asp.Net Core WebAPI 请求案例 Asp.Net WebApi Get请求整理&#xff08;一&#xff09; Asp.Net WebApi Post请求整理&#xff08;一&#xff09; Asp.Net WebApi Action命名中已‘Get’开头问题 …

VSCode大的JSON数据不能折叠问题

修改editor.foldingMaximumRegions为10000解决&#xff0c;默认只支持5000 在 VSCode 中&#xff0c;默认的 JSON 文件折叠功能对嵌套层级较深的数据支持有限。以下是几种解决嵌套 4 层以上数据无法折叠的方法&#xff1a; 1. 使用扩展插件 安装支持更复杂折叠功能的插件&am…

IPoIB源码深度解析:如何基于TCP/IP协议栈实现高性能InfiniBand通信

一、IPoIB的核心设计理念 IPoIB(IP over InfiniBand)是一种在InfiniBand网络上承载IP流量的技术,其核心目标是在不修改上层应用的前提下,利用InfiniBand的高带宽和低延迟特性。与自定义协议栈不同,IPoIB通过深度集成到Linux内核TCP/IP协议栈中,将InfiniBand设备抽象为标…

Vue学习教程-18Vue单文件组件

文章目录 前言一、单文件组件的构成二、组件引用三、组件的应用举例1.组件实例2.显示结果 前言 Vue 单文件组件&#xff08;又名 *.vue 文件&#xff0c;缩写为 SFC&#xff09;是一种特殊的文件格式&#xff0c;它允许将 Vue 组件的模板、逻辑 与 样式封装在单个文件中。组件…

掌握 findIndex、push 和 splice:打造微信小程序的灵活图片上传功能✨

文章目录 ✨ 掌握 findIndex、push 和 splice&#xff1a;打造微信小程序的灵活图片上传功能 &#x1f31f;示例场景&#xff1a;小程序图片上传&#x1f33c; 认识 findIndex定义语法在代码中的应用示例当前行为 &#x1f680; 认识 push定义语法在代码中的应用示例特点 ✂️ …

微服务即时通信系统---(七)文件管理子服务

目录 功能设计 模块划分 业务接口/功能示意图 服务实现流程 服务代码实现 封装文件操作模块(utils.hpp) 获取唯一标识ID 文件读操作 文件写操作 编写proto文件 文件元信息 文件管理proto 单文件上传 多文件上传 单文件下载 多文件下载 RPC调用 服务端创建子…

fluent-ffmpeg 依赖详解

fluent-ffmpeg 是一个用于在 Node.js 环境中与 FFmpeg 进行交互的强大库&#xff0c;它提供了流畅的 API 来执行各种音视频处理任务&#xff0c;如转码、剪辑、合并等。 一、安装 npm install fluent-ffmpeg二、基本使用 要使用 fluent-ffmpeg&#xff0c;首先需要确保系统中…

第16天:C++多线程完全指南 - 从基础到现代并发编程

第16天&#xff1a;C多线程完全指南 - 从基础到现代并发编程 一、多线程基础概念 1. 线程创建与管理&#xff08;C11&#xff09; #include <iostream> #include <thread>void hello() {std::cout << "Hello from thread " << std::this_…

Pwntools 的详细介绍、安装指南、配置说明

Pwntools&#xff1a;Python 开源安全工具箱 一、Pwntools 简介 Pwntools 是一个由 Security researcher 开发的 高效 Python 工具库&#xff0c;专为密码学研究、漏洞利用、协议分析和逆向工程设计。它集成了数百个底层工具的功能&#xff0c;提供统一的 Python API 接口&am…

ES的简单讲解

功能 &#xff1a; 文档存储 与 文档搜索 特点&#xff1a;比如有一个文档名 “你好” 可以用‘你‘&#xff0c;好&#xff0c;你好都可以搜索到这个文档 ES核心概念 类似于数据库中表的概念&#xff0c;在表的概念下又对数据集合进行了细分 ​ ES_Client查询接口 cpr::R…

leetcode_字典树 139. 单词拆分

139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 思路: 定义状态&#xff1a; 设dp[i]表…

宝塔安装向量数据库-Milvus

注&#xff1a;宝塔需要安装好docker容器组件&#xff01; 1、纯血宝塔安装 1.1 在线上镜像中&#xff0c;拉取milvus镜像&#xff0c;创建milvus容器 1.2 安装milvus管理工具ATTU&#xff1b;同样方式拉取线上镜像创建attu容器 2、自定义安装 2.1修改配置 {"registry-…

【K8S】Kubernetes 基本架构、节点类型及运行流程详解(附架构图及流程图)

Kubernetes 架构 k8s 集群 多个 master node 多个 work nodeMaster 节点&#xff08;主节点&#xff09;&#xff1a;负责集群的管理任务&#xff0c;包括调度容器、维护集群状态、监控集群、管理服务发现等。Worker 节点&#xff08;工作节点&#xff09;&#xff1a;实际运…