android:在android中使用spannable字符串时出错

时间:2014-12-18 09:46:03

标签: android

我是android的新手。我希望我的文字颜色应该在一两秒后改变,所以我使用了counDownTimerspannableString来执行。它第一次正常工作。但我想再次重启按钮点击操作,但我收到错误。

private void textAnimation() 
    {
        final String str[] = tvPrayer.getText().toString().split(" ");
        long totalTime = (str.length + 2) * 500;
        Log.i(TAG, "totalTime: " + totalTime);

        timer = new CountDownTimer(totalTime, 500)
        {
            @Override
            public void onTick(long millisUntilFinished) 
            {
                Log.i(TAG, "In side Tick");
                String val = str[counter++];
                Log.i(TAG, "val is :" + val);

                spannableString = new SpannableString(tvPrayer.getText().toString());
                lastIndex = indexOf+ val.length();
                Log.i(TAG, "start index :"+ indexOf);
                Log.i(TAG, "last index :" + lastIndex);
                spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#FFA500")),0,lastIndex, 0);
                indexOf =0;
                indexOf = lastIndex+1;
                tvPrayer.setText(spannableString);

            }

            @Override
            public void onFinish()
            {
                timer.cancel();
            }
        };
    }

按钮点击,我刚刚重启。

这是我的logcat。

12-18 14:55:31.949: E/AndroidRuntime(9804): FATAL EXCEPTION: main
12-18 14:55:31.949: E/AndroidRuntime(9804): java.lang.IndexOutOfBoundsException: setSpan (0 ... 233) ends beyond length 229
12-18 14:55:31.949: E/AndroidRuntime(9804):     at android.text.SpannableStringInternal.checkRange(SpannableStringInternal.java:349)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:77)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at android.text.SpannableString.setSpan(SpannableString.java:46)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at com.mindbowser.fragments.Practice4BPrayerFragment$1.onTick(Practice4BPrayerFragment.java:129)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:124)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at android.os.Looper.loop(Looper.java:137)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at android.app.ActivityThread.main(ActivityThread.java:4424)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at java.lang.reflect.Method.invokeNative(Native Method)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at java.lang.reflect.Method.invoke(Method.java:511)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-18 14:55:31.949: E/AndroidRuntime(9804):     at dalvik.system.NativeStart.main(Native Method)d the timer.

2 个答案:

答案 0 :(得分:3)

12-18 14:55:31.949: E/AndroidRuntime(9804): java.lang.IndexOutOfBoundsException: setSpan (0 ... 233) ends beyond length 229

很明显,spannableString的长度为229,而您尝试使用lastIndex调用setSpan为233。

问题出在lastIndex

lastIndex = indexOf+ val.length();

这里,当你第一次调用这个函数时,indexOf就像这样改变了:

indexOf = lastIndex+1; 

(第一次这是第一次,indexOf是0。)

这会使lastIndex超出实际字符串的长度。

如果要在上次更改文本后设置文本范围,请在indexOf中使用startIndex。不要将其添加到lastIndex

答案 1 :(得分:0)

正如文件所说:

public abstract void setSpan (Object what, int start, int end, int flags)

  

将指定的标记对象附加到文本的范围start…end,   或者如果对象已经附加在其他地方,则将对象移动到该范围。

在您的情况下,文字表示来自tvPrayer.getText().toString()的{​​{1}}。

那么,您认为spannableString = new SpannableString(tvPrayer.getText().toString())始终是0,lastIndex的正确开始位置和结束位置吗?