Я хочу выделить одно слово из ArrayList - PullRequest
0 голосов
/ 07 июня 2019

Я хочу придать цвет фона тексту, который я получаю из списка.В настоящий момент я могу выделить все слова, но я хотел бы исключить пробелы между словами

Изначально я пытался использовать решение регулярного выражения Pattern Matcher, чтобы исключить двойные пробелы, я добавлялсписок.Тогда я понял, что это решение не было лучшим, потому что я не мог исключить пробелы.Поэтому я решил использовать SpannableStringBuilder и добавить элементы в цикл for.Но не работает, я выделяю только первое слово, а не все отдельные слова (разделенные пустым (не цветным) словом

val spannable = SpannableStringBuilder()
            val span = BackgroundColorSpan(yellowColor))


            listOfUsers.forEach {
                val string = it.users

                spannable.append(string)
                spannable.setSpan(span, 0, string.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            }

            textValue.text = spannable

Я ожидаю увидеть не только первое слово, но и отдельные словаПожалуйста, обратите внимание, что я знаю, что проблема в setSpan, где я ставлю начало 0, но я не знаю, как заставить работать так, чтобы выделить правильную начальную строку [I] символ

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Вы можете написать регулярное выражение, как показано ниже, чтобы соответствовать нескольким пробелам.Вы также можете заменить.

fun regexTest(){
    val words = listOf("Hello", "Hello World1", "Hello  World2",
        "Hello    World3", "Hello World4   ")

    val pattern = "\\s+".toRegex()


    words.forEach { word ->
        if (pattern.containsMatchIn(word)) {
            println("match ---> $word")
            var temWord = word.replace("\\s+"," ")

        }
    }

    var result:ArrayList<String> = ArrayList()
    for (s in words) {
        result.add(s.replace(pattern, " "))
    }

    for(wordToPrint in result){
        println("replaced ---> $wordToPrint")
    }

}

Ниже приведен вывод для вышеуказанной программы:

match ---> Hello World1
match ---> Hello  World2
match ---> Hello    World3
match ---> Hello World4   
replaced ---> Hello
replaced ---> Hello World1
replaced ---> Hello World2
replaced ---> Hello World3
replaced ---> Hello World4 

Вы можете изменить регулярное выражение в соответствии со своими потребностями.

0 голосов
/ 07 июня 2019

Вы можете создать метод, который возвращает Spannable, как показано ниже:

public Spanned formatAutoSuggestText(final String autoSuggestText) {
        if (autoSuggestText == null) {
            return Html.fromHtml("");
        }

        try {
            String modifiedAutoSuggestText= "" ;
            final String searchText = "Text to highlight";
            final Pattern pattern = Pattern.compile(StringUtils.INSENSITIVE_CASE + searchText);
            final Matcher matcher = pattern.matcher(autoSuggestText);  
            int end = 0;
            while (matcher.find()) {
                final String subStringMatchFound = autoSuggestText.substring(end, matcher.end());
                final String stringToBeReplaced = autoSuggestText.substring(matcher.start(), matcher.end());
                final String stringToReplace = "<b><font color='" + mContext.getResources().getColor(R.color.search_autosuggest_highlighted_text) + "'>" +matcher.group()+ "</font></b>";
                modifiedAutoSuggestText += subStringMatchFound.replace(stringToBeReplaced,stringToReplace);
                end = matcher.end();
            }
            modifiedAutoSuggestText += autoSuggestText.substring(end);
            return Html.fromHtml(modifiedAutoSuggestText);
        }
        catch (final Exception e){
            return Html.fromHtml(autoSuggestText);
        }

    }

Код на Java.Вы можете изменить это в зависимости от ваших потребностей.

...