我是android的新手。我希望我的文字颜色应该在一两秒后改变,所以我使用了counDownTimer
和spannableString
来执行。它第一次正常工作。但我想再次重启按钮点击操作,但我收到错误。
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.
答案 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
的正确开始位置和结束位置吗?