Android-Wyróżnij słowo w widoku tekstowym?

Mam database search query, które wyszukują w bazie danych słowo wprowadzone przez użytkownika i zwracają Cursor.

W moim ListActivity, mam ListView, który będzie trzymał elementy (elementy kursora). Układ elementów ListView jest w zasadzie TextView. ListView będzie listą TextView's.

Chcę wyróżnić search term gdziekolwiek się pojawi w TextView. Chodzi mi o podświetlanie: inny kolor lub inny kolor tła lub cokolwiek sprawia, że różni się od reszty tekst.

Czy to możliwe? i jak?

Update:

cursor = myDbHelper.search(term);  //term: a word entered by the user.
cursor.moveToFirst();
String[] columns = {cursor.getColumnName(1)}; 
int[] columnsLayouts = {R.id.item_title}; //item_title: the TextView holding the one raw
ca = new SimpleCursorAdapter(this.getBaseContext(), R.layout.items_layout, cursor,columns , columnsLayouts);
lv = getListView();
lv.setAdapter(ca);

Dla @Shailendra: metoda search() zwróci niektóre tytuły. Chcę podkreślić słowa w tych tytułach, które pasują do słowa term. Mam nadzieję, że teraz to jasne.

Author: iTurki, 2011-07-27

6 answers

Wstaw kod HTML dla koloru, a następnie Ustaw ten tekst .

Jak

origString = origString.replaceAll(textToHighlight,"<font color='red'>"+textToHighlight+"</font>");

Textview.setText(Html.fromHtml(origString));
 37
Author: Shailendra Singh Rajawat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-05 15:58:27
TextView textView = (TextView)findViewById(R.id.mytextview01);

//use a loop to change text color
Spannable WordtoSpan = new SpannableString("partial colored text");        
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(WordtoSpan);

Liczby 2 i 4 są indeksami start/stop dla kolorowania tekstu, w tym przykładzie" rti " będzie kolorowany.

Więc w zasadzie wystarczy znaleźć indeks początkowy szukanego słowa w tytule:

int startIndex = titleText.indexOf(term);
int stopIndex = startIndex + term.length();

A następnie zastąp liczby 2 i 4 indeksami, a" częściowy kolorowy tekst " ciągiem tytułowym.

Źródło: https://stackoverflow.com/a/10279703/2160827

 18
Author: finstas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:35

Nie robiłam tego, ale wygląda to obiecująco:

http://developer.android.com/reference/android/text/SpannableString.html
http://developer.android.com/guide/topics/resources/string-resource.html

Public final void setText (tekst znaków)

Since: API Level 1 ustawia wartość string w TextView. TextView nie akceptuje formatowania w stylu HTML, co można zrobić z tekstem ciągi w plikach zasobów XML. Aby wystylizować struny, Dołącz android.tekst.styl.* obiekty do SpannableString, lub zobacz Dostępna dokumentacja typów zasobów dla przykładowego ustawienia sformatowany tekst w XML plik zasobów.

Http://developer.android.com/reference/android/widget/TextView.html

 2
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-27 11:45:01

Wiem, że to stare pytanie, ale stworzyłem metodę podkreślania powtarzającego się słowa w łańcuchu \ paragraf.

private Spannable highlight(int color, Spannable original, String word) {
    String normalized = Normalizer.normalize(original, Normalizer.Form.NFD)
            .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

    int start = normalized.indexOf(word);
    if (start < 0) {
        return original;
    } else {
        Spannable highlighted = new SpannableString(original);
        while (start >= 0) {
            int spanStart = Math.min(start, original.length());
            int spanEnd = Math.min(start+word.length(), original.length());

            highlighted.setSpan(new ForegroundColorSpan(color), spanStart,
                    spanEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

            start = normalizedText.indexOf(word, spanEnd);
        }
        return highlighted;
    }
}

Użycie:

textView.setText(highlight(primaryColor, textAll, wordToHighlight));
 2
Author: Sumit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-06 17:41:06

Wypróbuj tę bibliotekę Android TextHighlighter .

Implementacje

TextView.setText() pobiera parametr Spannable nie tylko CharacterSequence. SpannableString posiada metodę setSpan(), która umożliwia stosowanie stylów.

Zobacz listę bezpośredniego podklasy postaci CharacterStyle https://developer.android.com/reference/android/text/style/CharacterStyle.html

  • przykład podania koloru tła i koloru pierwszego planu dla słowa "Hello" w "Hello, World"
Spannable spannable = new SpannableString("Hello, World");
// setting red foreground color
ForegroundSpan fgSpan = new ForegroundColorSpan(Color.red);
// setting blue background color
BackgroundSpan bgSpan = new BackgroundColorSPan(Color.blue);

// setSpan requires start and end index
// in our case, it's 0 and 5
// You can directly set fgSpan or bgSpan, however,
// to reuse defined CharacterStyle, use CharacterStyle.wrap()
spannable.setSpan(CharacterStyle.wrap(fgSpan), 0, 5, 0);
spannable.setSpan(CharacterStyle.wrap(bgSpan), 0, 5, 0);

// apply spannableString on textview
textView.setText(spannable);
 1
Author: xeoh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-25 07:27:50

Robisz to w xml strings jeśli twoje struny są statyczne

<string name="my_text">This text is <font color='red'>red here</font></string>
 0
Author: Isaac Sekamatte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-23 13:30:32