TextView 必填项pro版

该文章介绍了一种在Android中自定义TextView的方法,用于处理必填项前的星号,并能控制星号的显示、隐藏以及对齐方式。通过MiRequiredTextViewPro类,可以设置前缀文本、颜色以及可见性(包括可见、不可见和完全消失三种状态),解决了对齐问题。
摘要由CSDN通过智能技术生成

优点

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


/**
 * 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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值