跨站攻击 wordpress,wordpress程序重装,中国商铺网,免费制作ai动画软件遇到一个需求#xff0c;让Android端实现给定一个字符串指定下标的几个字颜色与其他字颜色不一致。 主要是用ForegroundColorSpan这个API来传入颜色值#xff0c;用SpannableString来设置指定索引下标的字的颜色值。 这里通过给定一个输入文字描述框#xff0c;要求输入指定…遇到一个需求让Android端实现给定一个字符串指定下标的几个字颜色与其他字颜色不一致。 主要是用ForegroundColorSpan这个API来传入颜色值用SpannableString来设置指定索引下标的字的颜色值。 这里通过给定一个输入文字描述框要求输入指定下标输入格式类似于1,3,4,6。输入数字同时用英文逗号隔开只要点击按钮提交以后则来改变显示的字体颜色。 布局文件如下所示
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityEditTextandroid:idid/edit_numandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:hint输入下标例如 1,3,5tools:ignoreMissingConstraints/EditTextButtonandroid:idid/submitandroid:text提交android:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintHorizontal_bias0.467app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfid/edit_numapp:layout_constraintVertical_bias0.26tools:ignoreMissingConstraints/ButtonTextViewandroid:idid/text_viewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textHelloWorldapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent //androidx.constraintlayout.widget.ConstraintLayout MainActivity如下所示
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.widget.Button
import android.widget.EditText
import android.widget.TextViewclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val indexInput findViewByIdEditText(R.id.edit_num)val textView findViewByIdTextView(R.id.text_view)val buttonSubmit findViewByIdButton(R.id.submit)val originalText HelloWorld 测试文字颜色变化// 初始化显示原始文本textView.text originalTextbuttonSubmit.setOnClickListener {val s indexInput.textval strArray s?.toString()val indexArray strArray?.split(,)val len indexArray?.size ?: 20val indexNumArray IntArray(len){0}// 创建 SpannableStringval spannableString SpannableString(originalText)indexArray?.let {for (i in indexArray.indices) {indexNumArray[i] Integer.parseInt(indexArray[i])val idx indexNumArray[i]// 检查下标是否有效避免越界错误if (idx in originalText.indices) {// 为每个字符创建一个新的 ForegroundColorSpanval redColorSpan ForegroundColorSpan(Color.RED)spannableString.setSpan(redColorSpan,idx,idx 1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)}}}textView.text spannableString}}
}
其中这里有个需要注意的是
如果需要多次变更字体颜色需要把ForegroundColorSpan设置在循环体内。如果把ForegroundColorSpan放在循环体外则只有最后一个字会生效。错误示例如下 val redColorSpan ForegroundColorSpan(Color.RED)indexArray?.let {for (i in indexArray.indices) {indexNumArray[i] Integer.parseInt(indexArray[i])val idx indexNumArray[i]spannableString.setSpan(redColorSpan, idx, idx 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) // 第index个字}}
问题原因
你在循环中对每个字符的位置都应用了相同的 ForegroundColorSpan红色并且每次调用 setSpan 时该 Span 会替换之前的位置上的 Span导致只有最后一个字符保持红色。
解决方案
为了解决这个问题确保为每个字符应用不同的颜色时不要覆盖先前的 Span。可以通过创建一个新的 ForegroundColorSpan 实例并在每次 setSpan 时分别应用。 关键更改
确保每次 setSpan 使用新的 ForegroundColorSpan 对象 在每次循环中创建一个新的 ForegroundColorSpan 实例确保不会覆盖先前的颜色设置。下标校验 在 setSpan 之前确保你所提供的下标值是合法的避免越界问题idx in 0 until originalText.length。IntArray 初始化 使用 IntArray 来存储转换后的下标值并确保在处理时进行合理的范围检查。
效果
当用户输入下标例如 1,3,5然后点击按钮时指定下标的字符将正确变为红色不会再出现只有最后一个字符变色的情况。