Reputation: 23
I'm new to android.I want my text color should change after some second or half so i have used counDownTimer
and spannableString
to perform. Its working properly for the first time.but i want to restart this operation again of button click but I'm receiving an error.
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();
}
};
}
Onbutton click, I have just restart.
Here is my 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.
Upvotes: 0
Views: 2674
Reputation: 14011
As the documentation says:
public abstract void setSpan (Object what, int start, int end, int flags)
:
Attach the specified markup object to the range
start…end
of the text, or move the object to that range if it was already attached elsewhere.
In your case, the text means tvPrayer.getText().toString()
from spannableString = new SpannableString(tvPrayer.getText().toString())
.
So, do you think 0,lastIndex
is always the right beginning position and ending position of tvPrayer.getText().toString()
?
Upvotes: 0
Reputation: 28823
12-18 14:55:31.949: E/AndroidRuntime(9804): java.lang.IndexOutOfBoundsException: setSpan (0 ... 233) ends beyond length 229
Its clear that your spannableString
's length is 229, while you are trying to call setSpan using lastIndex as 233.
Issue is with lastIndex
lastIndex = indexOf+ val.length();
Here, indexOf is changed like this when you call this function for first time:
indexOf = lastIndex+1;
(First time this worked as first time, indexOf
was 0.)
This is increasing your lastIndex
beyond the length of actual string.
If you want to set span for text after last changed text, then use indexOf
in startIndex
. Don't add it to lastIndex
.
Upvotes: 3