如何在EditText中高亮显示多个单词?

4
目前我正在开发一个拼写和语法检查应用程序。它有一个EditText,用户可以在其中输入文本,还有一个名为“Check Text”的按钮,点击该按钮后,应用程序将调用LanguageTool API来检查文本,并返回带有结果的JSON响应。
以下是应用程序的屏幕截图:enter image description here 以下是我尝试过的代码,用于突出显示多个单词,但此代码仅突出显示我创建的数组中的最后一个单词:
for (int i = 0; i < errorStrings.size(); i++) {

// Here textToCheck is EditText & errorStrings is ArrayList of type WrongString class which i have created to hold Error string , offset & length.

Spannable wordtoSpan = new SpannableString(texttoSend);
wordtoSpan.setSpan(new BackgroundColorSpan(Color.BLUE),errorStrings.get(i).getOffset(),
                                        (errorStrings.get(i).getOffset()+errorStrings.get(i).getLength()), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                            textToCheck.setText(wordtoSpan);
}

嗨@DeepShah,有没有关于在编辑文本中用自定义单词替换已选单词的建议?我正在做同样的功能,任何建议都将是巨大的帮助。 - LOKESH KUMAR PEDDA
2个回答

12

我已经编写了一个简单的方法,允许您传递TextView(或其子类如Button, Edittext等)。

1. 如果您想要像在段落中查找单词一样突出显示文本,则可以使用下面的方法。

setHighLightedText(yourTextView_Edittext_Button, "a");

这将给您如下结果。

输入图像描述

    /**
     * use this method to highlight a text in TextView
     * @param tv TextView or Edittext or Button or child of TextView class
     * @param textToHighlight Text to highlight
     */
    public void setHighLightedText(TextView tv, String textToHighlight) {
        String tvt = tv.getText().toString();
        int ofe = tvt.indexOf(textToHighlight, 0);
        Spannable wordToSpan = new SpannableString(tv.getText());
        for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
            ofe = tvt.indexOf(textToHighlight, ofs);
            if (ofe == -1)
                break;
            else {
                wordToSpan.setSpan(new BackgroundColorSpan(0xFFFFFF00), ofe, ofe + textToHighlight.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
            }
        }
    }

2. 如果您想制作可点击的高亮文本(例如单击条款和条件文本),请使用以下代码:

 setClickableHighLightedText(yourTextView_Edittext_Button, "go to settings", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO: do your stuff here 
        }
    });

这将给您像这样的结果

输入图像描述

/**
 * use this method to set clickable highlighted a text in TextView
 *
 * @param tv              TextView or Edittext or Button or child of TextView class
 * @param textToHighlight Text to highlight
 */
public void setClickableHighLightedText(TextView tv, String textToHighlight, View.OnClickListener onClickListener) {
    String tvt = tv.getText().toString();
    int ofe = tvt.indexOf(textToHighlight, 0);
    ClickableSpan clickableSpan = new ClickableSpan() {
        @Override
        public void onClick(View textView) {
            if (onClickListener != null) onClickListener.onClick(textView);
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setColor(0xff0000ff);
            ds.setUnderlineText(true);
        }
    };
    SpannableString wordToSpan = new SpannableString(tv.getText());
    for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
        ofe = tvt.indexOf(textToHighlight, ofs);
        if (ofe == -1)
            break;
        else {
            wordToSpan.setSpan(clickableSpan, ofe, ofe + textToHighlight.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
            tv.setMovementMethod(LinkMovementMethod.getInstance());
        }
    }
}

这是一个解决方法,你可以根据需要自定义span。一些好的教程: Android文本样式另外一个


1
嗨@Khemu,你有没有想过在编辑文本中用自定义建议的单词替换已选中的单词? - Deep Shah
1
嗨Deep, 我根据你的要求编辑了我的答案,希望能有所帮助。 - Khemraj Sharma

0

给你 -

  TextView myTV = (TextView)findViewById(R.id.textView1);
  String  textString = "StackOverFlow Rocks!!!"; 
  Spannable spanText = Spannable.Factory.getInstance().newSpannable(textString);
  spanText.setSpan(new BackgroundColorSpan(0xFFFFFF00), 14, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  myTV.setText(spanText);

这里有一个类似问题的帖子


@Deep Shah,为什么不将错误字符串存储在另一个列表中并单独突出显示错误?您能否在for循环之前发布代码?这样会更清晰。我认为错误在这里 textToCheck.setSelection(errorStrings.get(i).getOffset(),(errorStrings.get(i).getOffset()+errorStrings.get(i).getLength()));。请发布您收到的输出图像。 - supro_96
嗨,我已经更新了代码。我更喜欢在EditText中显示错误,这样他们可以立即从那里进行编辑。 - Deep Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接