Стиль HTML в textview идет не так, как надо Android

Я выбираю часть TextView и, нажав кнопку "выделить", отправляю в базу данных начальный и конечный индексы выбора. Затем я загружаю все начальные и конечные индексы из БД и меняю цвет текста между ними.

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

МОЙ КОД:

  1. Когда пользователь выбирает и нажимает кнопку выделения

    int i=contentText.getSelectionStart();
    int j=contentText.getSelectionEnd();
    
    db.insertHiglightIndex(String.valueOf(i),String.valueOf(j));
    setHighlightedText();
    
  2. Метод setHighlightedText().

    String fullText=contentText.getText().toString();
    for(int i=0; i<db.getAllStartIndex().size();i++){
        String a=fullText.substring(Integer.parseInt(db.getAllStartIndex().get(i)),Integer.parseInt(db.getAllEndIndex().get(i)));
        fullText = fullText.replace(a, "<font color='red'>"+a+"</font>");
    }
    contentText.setText(Html.fromHtml(fullText), TextView.BufferType.SPANNABLE);
    

МОИ СКРИНШОТЫ.

Выбор:

Результат:

Ясно, что выбранная область от "Garrick" до "Bart", а результат от "entity" до "2012"

Я не могу понять, почему это происходит. Я думаю, что есть некоторая проблема с этим <font color='red'>"+a+"</font> линия.

Спасибо

2 ответа

Решение

Это неправильно проиндексировано, потому что там уже добавлено <font color='red'> в начале, так что во второй раз этот тег также считается частью строки, поэтому я предлагаю создать новую временную строку, назначить тот же текст строке, но после замены предыдущего тега шрифта, который он содержал. Используйте этот синтаксис для удаления предыдущего font тег от originalString

String tempString = originalString.replaceAll("[<](/)?font[^>]*[>]", "");

После этого работаю только с tempString, Это значит снова добавить каждый предыдущий font пометить нужно tempString и установите этот текст.

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

У вас неправильные индексы, потому что вы изменяете fullText содержание в цикле.

Взглянув на этот пример, вы можете понять это:

final TextView tv = (TextView) findViewById(R.id.textView);
tv.setText( "abcdefghijklmnopqrstuvwxyz0123456789");

String fullText= tv.getText().toString();

// your first iteration
String a = fullText.substring(1,3);
// a contains "ab"
fullText = fullText.replace(a, "<font color='red'>"+a+"</font>");

После первой итерации полный текст теперь содержит

a<font color='red'>bc</font>defghijklmnopqrstuvwxyz0123456789"

Тогда substring() во второй итерации не возвращает базу подстроки на исходное содержимое.

Если вы хотите иметь возможность иметь несколько подстрок, окрашенных в красный цвет, вы можете попробовать это:

String fullText = contentText.getText().toString();
StringBuilder result = new StringBuilder();

for(int i=0; i < db.getAllStartIndex().size(); i++){
    fullText = applyFont(result, fullText, Integer.parseInt(db.getAllStartIndex().get(i)), Integer.parseInt(db.getAllEndIndex().get(i)));
}
// Add here the remaining content
result.append(fullText);
contentText.setText(Html.fromHtml(result.toString()), TextView.BufferType.SPANNABLE);


private String applyFont(StringBuilder result, String source, int from, int to){
    result.append(source.substring(0, from));
    result.append("<font color='red'>");
    result.append(source.substring(from, to));
    result.append("</font>");
    return source.substring(to, source.length());
}
Другие вопросы по тегам