【问题标题】:Caused by: java.lang.IndexOutOfBoundsException on AutocompleteTextView [duplicate]引起:AutocompleteTextView 上的 java.lang.IndexOutOfBoundsException [重复]
【发布时间】:2023-03-28 20:08:02
【问题描述】:

当我尝试获取用户在 AutoCompleteTextView 中键入的第一个和最后一个字符的位置时出现此错误。

如果能提供任何帮助,我将不胜感激。

当我添加一个 textChangeListener 时,我仍然得到错误 java.lang.IndexOutOfBoundsException: setSpan (0 ... -1) 在开始之前已经结束

这是我下面的代码:

final AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocompleteView);

autoCompleteTextView.setAdapter(autoComplete);

autoCompleteTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        //my statements


    }
});

        autoCompleteTextView.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //int start = startText.indexOf(0);
            String startText = autoCompleteTextView.getText().toString();
            int end = startText.indexOf(1);
            SpannableStringBuilder builder = new SpannableStringBuilder(startText);
            // set foreground color (text color) - optional, you may not want to change the text color too
            builder.setSpan(new ForegroundColorSpan(Color.RED), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            // set background color
            builder.setSpan(new BackgroundColorSpan(Color.YELLOW), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            // set result to AutoCompleteTextView
            autoCompleteTextView.setText(builder);
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

错误日志

    01-31 16:02:37.418 20357-20357/? E/AndroidRuntime: FATAL EXCEPTION: main
                                               Process: com.lawerh.jonathan.partygoer, PID: 20357
                                               java.lang.IndexOutOfBoundsException: setSpan (0 ... -1) has end before start
                                                   at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1101)
                                                   at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:680)
                                                   at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:673)
                                                   at com.lawerh.jonathan.partygoer.ui.MapActivity$8.onTextChanged(MapActivity.java:328)
                                                   at android.widget.TextView.sendOnTextChanged(TextView.java:8320)
                                                   at android.widget.TextView.handleTextChanged(TextView.java:8385)
                                                   at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:10531)
                                                   at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:1051)
                                                   at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:572)
                                                   at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:503)
                                                   at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:502)
                                                   at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:693)
                                                   at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:453)
                                                   at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:340)
                                                   at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78)
                                                   at android.os.Handler.dispatchMessage(Handler.java:111)
                                                   at android.os.Looper.loop(Looper.java:207)
                                                   at android.app.ActivityThread.main(ActivityThread.java:5728)
                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

【问题讨论】:

  • 请不要一遍又一遍地问同一个问题。
  • @Rotwang 我需要换个角度看待这个问题,而且你从来没有就其他问题回复过我
  • 我评论了另一个问题。这足以解决您的问题。

标签: java android autocompletetextview


【解决方案1】:

int end = int end = startText.indexOf(1);

返回-1,因为在字符串中找不到数字 1。然后,当您在 setSpan 调用中使用 end 时,您将传递 (0,-1)。仔细检查您的 startText 是否包含 1,可能您只需将 1 放在引号中,如下所示:

int end = int end = startText.indexOf("1");

【讨论】:

  • 这对我有用。但还有一件事 Spannable 方法不起作用。当我使用 spannable 方法时,我无法突出显示文本
【解决方案2】:

问题出在代码的int end = startText.indexOf(1); 行中。首先 indexOf() 函数将字符作为参数,但您传递 1 (integer) ,并且 indexOf() 函数返回 -1 并且当您设置 span builder.setSpan(new ForegroundColorSpan(Color.RED), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 时,最终值为 -1,这会抛出 IndexOutOfBoundsException

【讨论】:

  • 字符串 q=""; int start = selectText.indexOf(q); int end = q.length()+start;但是 builder.setSpan(new ForegroundColorSpan(Color.RED), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);不适合我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
相关资源
最近更新 更多