indexoutofboundexception : setSpan (22) заканчивается за пределами длины 1

У меня есть пользовательский элемент управления MultiAutoCompleteTextView, в котором я создаю текст фишки, когда пользователь нажимает клавишу пробела.

Я не хочу, чтобы пользователь изначально вводил пробел, когда текстовое поле пусто, поэтому я поставил inputFilter, чтобы пользователь не мог изначально вводить пробел.

Вот код фильтра:

private void RestrictUselessSpaces(){
    InputFilter filter = new InputFilter() { 

        public CharSequence filter(CharSequence source, int start, int end, 
Spanned dest, int dstart, int dend) { 

            for (int i = start; i < end; i++) { 
                if (Character.isWhitespace(source.charAt(i))) { 

                    if(!getText().toString().trim().equals(""))
                    {
                        return " "; 
                    }
                    else
                    {
                        return "";
                    }
                } 
        } 
        return null; 
        } 
};  

    setFilters(new InputFilter[]{filter});
}

Как-то, когда я комментирую функцию RestrictUselessSpaces. Это работает нормально. Но когда эта функция работает. Чем если я попытаюсь ввести пробел после символа. Это дает мне ошибку indexoutofboundexception. Вот мой код, где я получаю ошибку.

public void setChips(String s){

    if(s.contains(" ") && !s.trim().equals("")) // check space in string
    {
        this.chips = s.trim().split(" ");

        SpannableStringBuilder ssb = new SpannableStringBuilder(getText());
        // split string wich comma
        int x =0;
        // loop will generate ImageSpan for every country name separated by comma
        for(String c : chips){
            // inflate chips_edittext layout 
            LayoutInflater lf = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            TextView textView = (TextView) lf.inflate(R.layout.chips_edittext, null);
            textView.setText(c); // set text


            setFlags(textView, c); // set flag image
            // capture bitmapt of genreated textview
            int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
            textView.measure(spec, spec);
            textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
            Bitmap b = Bitmap.createBitmap(textView.getWidth(), textView.getHeight(),Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(b);
            canvas.translate(-textView.getScrollX(), -textView.getScrollY());
            textView.draw(canvas);
            textView.setDrawingCacheEnabled(true);
            Bitmap cacheBmp = textView.getDrawingCache();
            Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888, true);
            textView.destroyDrawingCache();  // destory drawable
            // create bitmap drawable for imagespan
            BitmapDrawable bmpDrawable = new BitmapDrawable(viewBmp);
            bmpDrawable.setBounds(0, 0,bmpDrawable.getIntrinsicWidth(),bmpDrawable.getIntrinsicHeight());
            // create and set imagespan 
            ssb.setSpan(new ImageSpan(bmpDrawable),x ,x + c.length() , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    
            x = x+ c.length() +1;
        }

        // set chips span 
        setText(ssb);


        // move cursor to last 
        setSelection(s.length());
    }

}

Строка ssb.setSpan вызывает проблему, но когда я отлаживаю код. Отладчик запускает эту строку без каких-либо исключений. Ошибка возникает после выполнения этой функции, из-за чего мне сложнее определить, что на самом деле вызывает проблему.

И вот мой логарифм:

08-10 20:04:19.253: E/AndroidRuntime(18461): FATAL EXCEPTION: main
08-10 20:04:19.253: E/AndroidRuntime(18461): Process: com.example.twitter, PID: 18461
08-10 20:04:19.253: E/AndroidRuntime(18461): java.lang.IndexOutOfBoundsException: setSpan (2 ... 2) ends beyond length 1
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1016)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:592)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.text.Selection.setSelection(Selection.java:76)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.text.Selection.setSelection(Selection.java:87)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.widget.EditText.setSelection(EditText.java:94)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at com.example.libraries.ChipsMultiAutoCompleteTextview.setChips(ChipsMultiAutoCompleteTextview.java:281)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at com.example.libraries.ChipsMultiAutoCompleteTextview$1.onTextChanged(ChipsMultiAutoCompleteTextview.java:192)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.widget.TextView.sendOnTextChanged(TextView.java:7429)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.widget.TextView.handleTextChanged(TextView.java:7488)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9203)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:675)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:197)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:183)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:279)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.os.Handler.dispatchMessage(Handler.java:102)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.os.Looper.loop(Looper.java:212)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at android.app.ActivityThread.main(ActivityThread.java:5151)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at java.lang.reflect.Method.invokeNative(Native Method)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at java.lang.reflect.Method.invoke(Method.java:515)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:877)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
08-10 20:04:19.253: E/AndroidRuntime(18461):    at dalvik.system.NativeStart.main(Native Method)

person Mj1992    schedule 10.08.2014    source источник
comment
Попробуйте заменить этот код ssb.setSpan(new ImageSpan(bmpDrawable),x ,c.length()-1 , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);   -  person Haresh Chhelana    schedule 10.08.2014
comment
если ваш размер ssb равен 1, вы не можете установить диапазон от смещения 2 до смещения 2, кстати, диапазоны с длиной == 0, как в вашем случае, ведут себя странно на некоторых версиях Android   -  person pskink    schedule 10.08.2014
comment
@Haresh заменить на это?   -  person Mj1992    schedule 10.08.2014
comment
@pskink ssb size 1 означает длину текста, я полагаю. Значение x равно 0, а значение c.length() равно 1 в моем случае, если я ввожу только один символ. поэтому start=0 and end=1 я не думаю, что здесь что-то превышает 1. Я намеренно поставил -1 в третий аргумент, чтобы проверить, работает ли он, но это все равно не работает.   -  person Mj1992    schedule 10.08.2014
comment
Не могли бы вы просто удалить x+ из своего кода и сообщить мне, работает ли он? И, пожалуйста, имейте в виду, какой обычный exp. вы используете для разделения, которое не включено в разделенный массив, поэтому, пожалуйста, проверьте значение разделенного массива, после чего вы получите правильную идею.   -  person Haresh Chhelana    schedule 10.08.2014
comment
Также это кажется подозрительным x = x+ c.length() +1;, если ваша строка - b, вы будете звонить setSpan(..., 0, 0) и setSpan(..., 2, 2)...   -  person Salem    schedule 10.08.2014
comment
нет, значение x равно 2 (... setSpan (2…2) заканчивается за пределами длины 1)   -  person pskink    schedule 10.08.2014
comment
@Haresh удалил x+, все еще получая сообщение об ошибке   -  person Mj1992    schedule 10.08.2014
comment
Я ввожу только один символ g, чем нажимаю кнопку пробела, которая запускает этот код. Когда я ввожу один символ. Значение x равно 0, а c.length() дает 1. Ошибка говорит SetSpan(2..2), почему я не понимаю. Потому что x+c.length() = 1 вместо 2. Строка тоже работает нормально при отладке. Но после возврата из этой функции я получаю сообщение об ошибке. Ошибка как-то связана с функцией RestrictUselessSpaces, потому что когда я ее комментирую. Код работает нормально.   -  person Mj1992    schedule 10.08.2014
comment
Log.d эти два параметра setSpan(): начало, конец и ssb.length()   -  person pskink    schedule 10.08.2014
comment
Пожалуйста, проверьте длину c, потому что второй элемент массива может быть нулевым или пустым.   -  person Haresh Chhelana    schedule 10.08.2014
comment
@pskink @Haresh после регистрации. ssb.length() = 2 , Value of x = 0 , c.length() = 1   -  person Mj1992    schedule 10.08.2014
comment
см. источник вашей ошибки: androidxref.com/4.2_r1/xref/frameworks/base/core/java/android/   -  person pskink    schedule 10.08.2014


Ответы (1)


попробуйте использовать это

setSelection(s.length() - 1);
person suhoge    schedule 21.09.2017