TextView 必填项pro版

news2024/10/6 22:46:14

优点

基本解决对齐方式,可以设置前缀隐藏和显示


/**
 * https://blog.csdn.net/u013982652/article/details/94404711
 * Android自定义TextView实现必填项前面的*号
 * 另一种实现方式(推荐使用这种,有非必填情况的话不会有对齐问题)
 * <p>
 * <cn.mvp.mlibs.weight.MiRequiredTextViewPro
 * android:layout_width="wrap_content"
 * android:layout_height="wrap_content"
 * android:paddingLeft="12dp"
 * android:text="Hello World!"
 * app:prefixText="c11 "
 * app:prefixTextColor="@color/red"
 * app:prefixVisibility="invisible" />
 */
public class MiRequiredTextViewPro extends androidx.appcompat.widget.AppCompatTextView {

    private String prefixText;
    private int prefixTextColor;
    private int prefixVisibility;
    private int visible = 0, invisible = 1, gone = 2;

    public MiRequiredTextViewPro(Context context) {
        super(context);
        init(null);
    }

    public MiRequiredTextViewPro(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs);
    }

    public MiRequiredTextViewPro(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(attrs);
    }

    private void init(AttributeSet attrs) {
        if (attrs != null) {
            TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CustomTextView);
            prefixText = a.getString(R.styleable.CustomTextView_prefixText);
            prefixTextColor = a.getColor(R.styleable.CustomTextView_prefixTextColor, Color.RED);
            prefixVisibility = a.getInt(R.styleable.CustomTextView_prefixVisibility, View.VISIBLE);
            a.recycle();
        }
        updatePrefixVisibility();
        updatePrefixText();
        updatePrefixTextColor();
    }

    private void updatePrefixText() {
        if (prefixText != null) {
            setText(prefixText + getText());
        }
    }

    private void updatePrefixTextColor() {
        if (prefixText == null) {
            return;
        }
        SpannableString spannableString = new SpannableString(getText());
        spannableString.setSpan(new ForegroundColorSpan(prefixTextColor), 0, prefixText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        setText(spannableString);
    }

    /**
     * invisible:不显示,但是占位置
     * gone:彻底不显示,不占位置
     */
    private void updatePrefixVisibility() {
        if (prefixVisibility == invisible) {
            Paint paint = new Paint();
            paint.setTextSize(getTextSize());
            float textWidth = paint.measureText(prefixText);
            prefixText = "";
            setPadding((int) textWidth + getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom());
        } else if (prefixVisibility == gone) {
            prefixText = "";
        }
    }

    public void setPrefixText(String prefixText) {
        this.prefixText = prefixText;
        updatePrefixText();
    }

    public void setPrefixTextColor(int prefixTextColor) {
        this.prefixTextColor = prefixTextColor;
        updatePrefixTextColor();
    }

    public void setPrefixVisibility(int prefixVisibility) {
        this.prefixVisibility = prefixVisibility;
        updatePrefixVisibility();
    }
}

 样式


    <declare-styleable name="CustomTextView">
        <attr name="prefixText" format="string" />
        <attr name="prefixTextColor" format="color" />
        <attr name="prefixVisibility">
            <enum name="visible" value="0" />
            <enum name="invisible" value="1" />
            <enum name="gone" value="2" />
        </attr>
    </declare-styleable>

 

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

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

相关文章

2023年网络安全面试题:详细答案解析与最佳实践分享

如果在数据来源和网络分享方面存在侵权问题&#xff0c;请立即联系我以删除相关内容。 一句话木马 【基本原理】 利用文件上传漏洞&#xff0c;往目标网站中上传一句话木马&#xff0c;然后可以通过中国菜刀chopper.exe来获取和控制整个网站目录。表示后面即使执行错误&…

ZooKeeper原理剖析

1.ZooKeeper简介 ZooKeeper是一个分布式、高可用性的协调服务。在大数据产品中主要提供两个功能&#xff1a; 帮助系统避免单点故障&#xff0c;建立可靠的应用程序。提供分布式协作服务和维护配置信息。 2.ZooKeeper结构 ZooKeeper集群中的节点分为三种角色&#xff1a;Le…

curl: (56) Recv failure : Connection reset by peer

文章目录 背景原因可能如下1. 服务器端关闭了连接2. 网络问题3. 防火墙或代理问题4. 服务器负载过高 解决办法 背景 docker容器里有http服务&#xff0c;今天在docker容器重启时&#xff0c;去调用http接口&#xff0c;出现了以下错误&#xff1a; curl: (56) Recv failure :…

Explain执行计划中各个字段的含义

Explain执行计划中各个字段的含义 1、Explain有什么用2、Explain有哪些信息3、Explain执行计划详解 1、Explain有什么用 当Explain 与 SQL语句一起使用时&#xff0c;MySQL 会显示来自优化器关于SQL执行的信息。也就是说&#xff0c;MySQL解释了它将如何处理该语句&#xff0c…

Docker 架构解析:多角度解析 Docker 引擎与容器运行时

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

matlab重名函数调用踩坑记录

我新安装了matlab的robotics toolbox&#xff0c;然而调用的rotx不是我想要的函数。 我上网查了一下资料&#xff0c;知乎和csdn有相关的回答&#xff0c;但是我试了一下还是不行。它们的方法是移除路径再添加路径避免函数的冲突。相关方法放在文末的相关参考1 2。这里建议先用…

疯踏java知识点-进阶精讲篇

该资源是关于Java的师生管理系统&#xff0c;可以学习借鉴一下。 继续进行讲解&#xff0c;如果前面有不懂的&#xff0c;可以翻阅一下同专栏的其他文章&#xff0c;该专栏是针对Java的知识从0开始。 JavaBean 一个Java中的类&#xff0c;其对象可用于程序中封装数据举例&…

【C++】STL——vector的使用、 vector增删查改函数的介绍和使用、push_back和pop_back、operator[]

文章目录 1.vector的使用2.vector的增删查改&#xff08;1&#xff09;push_back 尾插&#xff08;2&#xff09;pop_back 尾删&#xff08;3&#xff09;find 查找&#xff08;4&#xff09;insert 在position之前插入val &#xff08;5&#xff09;erase 删除指定位置的数据&…

EXCEl——单元格移除换行

方法一&#xff1a;使用清除格式功能 步骤如下: 1.选中需要取消换行的单元格 2.在“开始"选项卡中找到"清除”功能&#xff0c;点击下拉菜单中的“清除格式" 3.这时单元格的换行就被取消了。 清除前效果图 清除后效果图 方法一&#xff1a;使用函数功能 步骤…

Camtasia Studio 2023保存为mp4格式的视频的详细教程,Camtasia的视频导出功能

很多用户刚接触Camtasia Studio&#xff0c;不熟悉如何保存mp4格式的视频。在今天的文章中小编为大家带来了Camtasia Studio 2023保存为mp4格式的视频的详细教程介绍。 1、 打开Camtasia Studio。 Camtasia Studio- 2023 win&#xff1a; https://souurl.cn/1JFEsn Camtasia …

HACKATHONCTF_1靶场详解

HACKATHONCTF_1靶场复盘 这个靶场有点CTF感觉&#xff0c;一步一步的没有什么难度。 下载地址&#xff1a;https://download.vulnhub.com/hackathonctf/ctf.zip 扫到ip后对ip进行一个单独扫描&#xff0c;发现开了四个端口&#xff0c;ssh设置到7223上了&#xff0c;这个很重…

SPP、SPPF 、 SimSPPF 、 ASPP、 SPPCSPC详解

分享自&#xff1a;https://blog.csdn.net/weixin_43694096/article/details/126354660 1. 原理 1.1 SPP&#xff08;Spatial Pyramid Pooling&#xff09; SPP 模块是何凯大神在2015年的论文《Spatial Pyramid Pooling in Deep Convolution Networks for Visual Recognitio…

前端工程化第一章:webpack基础(上)

文章目录 1. 什么是webpack&#xff1f;2. webpack使用2.2. 前置知识2.1. 创建一个项目 3. webpack打包3.1. 创建一个webpack.config.js文件3.2. 入口&#xff08;entry&#xff09;3.2.1. webpack.config.js3.2.2. src/index.js3.2.3. package.json 3.3. 输出&#xff08;outp…

C++第三讲

思维导图 手动封装一个顺序栈类&#xff08;数据元素为整形&#xff09;&#xff0c;要求私有成员属性&#xff1a;堆区空间的指针&#xff0c;用于存放数据&#xff0c;和一个指向栈顶元素的变量 /* ---------------------------------author&#xff1a;YoungZorncreated on…

nacos集群地址配置问题

#it is ip #example 127.0.0.1:8848 127.0.0.1:8849 127.0.0.1:8850 上面的配置可能存在配置失败的情况,可以采用下面的配置 127.0.0.1:8845 127.0.0.1.8846 127.0.0.1.8847 该配置在cluster.conf文件里面

还在使用冒泡排序遍历数组?No No No 库函数qsort帮你搞定所有排序还不快学起来!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《快速入门C语言》《C语言初阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言&#x1f4ac; 库函数qsort的介绍&#x1f4ac; 库函数qsort的参数介绍&#x1f4ad; 参数一 (void* base)…

Acwing.908 最大不相交区间数量(贪心)

题目 给定N个闭区间[ai,bi]&#xff0c;请你在数轴上选择若干区间&#xff0c;使得选中的区间之间互不相交&#xff08;包括端点)。输出可选取区间的最大数量。 输入格式 第一行包含整数N&#xff0c;表示区间数。 接下来N行&#xff0c;每行包含两个整数ai , bi&#xff0c…

【基于 GitLab 的 CI/CD 实践】03、GitLab Pipeline 实践(上)

目录 一、GitLab Pipeline 流水线语法有哪些&#xff1f;流水线参数列表 如何检查语法错误&#xff1f;流水线语法检测 二、Pipeline 基础语法 job script before_script after_script stages 未定义 stages ​定义 stages 控制 stage 运行顺序 .pre & .post …

2010年中国生态系统服务空间数据集

摘要 生态系统服务是生态系统形成并维持的人类赖以生存和发展的环境条件与效用&#xff0c;是测度自然生态系统保护价值的重要指标。采用科学方法模拟生态系统服务的空间分布对掌握当前我国生态本底状况&#xff0c;识别生态保护重要区&#xff0c;从而有效支持生态管理决策具…

关于金融英语的翻译技巧,你了解多少呢

据了解&#xff0c;金融英语除了具备通用英语特点之外 &#xff0c;还具备自己独特的特征&#xff0c;如专有名词多、专业术语量大、专业缩略词等。为了确保译文的准确性&#xff0c;翻译金融英语时要注意以下几点技巧。 一、专业术语坚持直译。金融翻译中涉及大量金融英语特有…