Anonymous
Anonymous

Reputation: 23

android: getting an error in using spannable string in android

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

Answers (2)

SilentKnight
SilentKnight

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

MysticMagicϡ
MysticMagicϡ

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

Related Questions