如何在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
相关产品推荐
相关产品推荐

