You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CustomTextView中拼接变量文本与固定字符串并解决异常

解决自定义TextView文本拼接的意外问题

嘿,我一眼就瞅见你这段自定义TextView代码里的问题啦——核心是无限递归循环,咱们一步步拆解修复:

问题根源

你在重写的setText方法里,先调用了super.setText(text, type),之后又在数字开头的判断分支里再次调用setText(text.toString()+" $")。这会触发一个死循环:每次调用setText都会进入你重写的方法,然后又执行拼接再调用setText,反复下去最终会导致栈溢出或者应用无响应。

另外还有两个小优化点:

  • 数字开头的判断写得太繁琐,能简化
  • getResources().getColor()在API 23+已经过时,建议用兼容方法

修正后的代码

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.support.v4.content.ContextCompat;

public class CustomTextViewTest extends android.support.v7.widget.AppCompatTextView {
    public CustomTextViewTest(Context context) {
        super(context);
    }
    public CustomTextViewTest(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public CustomTextViewTest(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        // 1. 先处理文本拼接逻辑,避免递归
        CharSequence finalText = text;
        if (text != null && text.length() > 0) {
            String textStr = text.toString();
            // 简化数字开头的判断
            if (Character.isDigit(textStr.charAt(0))) {
                finalText = textStr + " $";
            }
        }

        // 2. 根据处理后的文本设置颜色
        if (finalText != null) {
            String finalTextStr = finalText.toString();
            if (finalTextStr.contains("Available")) {
                setTextColor(ContextCompat.getColor(getContext(), R.color.green));
            } else if (finalTextStr.contains("Not Available")) {
                setTextColor(ContextCompat.getColor(getContext(), R.color.red));
            }
            // 如果有其他颜色逻辑,可以继续补充
        }

        // 3. 只调用一次super.setText,完成最终显示
        super.setText(finalText, type);
    }
}

关键改动说明

  • 避免递归:先把文本拼接的逻辑放在调用super.setText之前,只生成一次最终要显示的文本,再传给父类方法,彻底杜绝循环调用
  • 简化判断:用Character.isDigit(textStr.charAt(0))替代一堆startsWith,代码更简洁易维护
  • 兼容颜色获取:用ContextCompat.getColor()替代过时的getResources().getColor(),适配更高版本的Android系统
  • 逻辑顺序调整:先处理文本内容,再设置颜色,最后统一更新显示,逻辑更清晰

这样修改后,文本拼接和颜色设置的逻辑就能正常工作,不会再出现意外问题啦!

内容的提问来源于stack exchange,提问作者Tuhin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:39:02