wake-up-neo.net

Android - Markieren Sie ein Wort in einer Textansicht?

Ich habe einen database search query, der in der Datenbank nach einem vom Benutzer eingegebenen Wort sucht und einen Cursor zurückgibt.

In meinem ListActivity habe ich ein ListView, das die Elemente (die Cursor-Elemente) enthält. Das ListView-Elementlayout ist im Grunde ein TextView. Ich meine, das ListView wird eine Liste von TextView sein.

Was ich möchte, ist, den search term hervorzuheben, wo immer er in der TextView erscheint. Ich meine mit Hervorheben: Unterschiedliche Farbe oder Hintergrundfarbe oder irgendetwas unterscheidet es vom Rest des Textes.

Ist das möglich? und wie?

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);

Für @Shailendra: Die Methode search() gibt einige Titel zurück. Ich möchte die Wörter in den Titeln hervorheben, die dem Wort term entsprechen. Ich hoffe das ist jetzt klar.

26
iTurki

fügen Sie HTML-Code für Farbe um Word ein und setzen Sie ihn auf Ihre Textansicht. 

mögen 

String newString = oldString.replaceAll(textToHighlight, "<font color='red'>"+textToHighlight+"</font>");
textView.setText(Html.fromHtml(newString));
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);

Die Zahlen 2 und 4 sind Start-/Stopp-Indizes für die Einfärbung des Textes. In diesem Beispiel würde "rti" farbig sein.

Sie finden also im Grunde nur den Anfangsindex Ihres Suchworts im Titel:

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

und ersetzen Sie dann die Zahlen 2 und 4 durch die Indizes und "teilweise farbigen Text" durch Ihre Titelzeichenfolge.

quelle: https://stackoverflow.com/a/10279703/2160827

19
finstas

Ich weiß, es ist eine alte Frage, aber ich habe eine Methode entwickelt, um ein wiederholtes Word in String\Paragraph hervorzuheben.

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;
    }
}

verwendungszweck: 

textView.setText(highlight(primaryColor, textAll, wordToHighlight));
2
Sumit

Ich habe es nicht getan, aber das sieht vielversprechend aus:

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

public final void setText (Text mit Zeichenfolge)

Seit: API Level 1 Legt den Zeichenfolgewert der TextView fest. TextView Akzeptiert keine HTML-ähnliche Formatierung, die Sie mit Text - Zeichenfolgen in XML-Ressourcendateien ausführen können. Um Ihre Zeichenfolgen zu stylen, hängen Sie Android.text.style. * -Objekte an einen SpannableString an, oder sehen Sie in der Dokumentation Verfügbare Ressourcentypen ein Beispiel für das Setzen von formatiertem Text in XML Ressourcendatei.

http://developer.Android.com/reference/Android/widget/TextView.html

2
Tim

Versuchen Sie diese Bibliothek Android TextHighlighter

Implementierungen

TextView.setText() erhält einen Parameter als Spannable und nicht nur CharacterSequence. SpannableString hat eine Methode setSpan(), mit der Stile angewendet werden können.

Siehe Liste der direkten Unterklassenform CharacterStyle https://developer.Android.com/reference/Android/text/style/CharacterStyle.html

  • beispiel für die Angabe von Hintergrundfarbe und Vordergrundfarbe für Word "Hello" in "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
xeoh

Einfacher Weg

Sie können Spannable class zum Hervorheben/Formatieren von Text verwenden.

textView.setText("Hello, I am Awesome, Most Awesome"); // set text first
setHighLightedText(textView, "a"); // highlight all `a` in TextView

 Output

Hier ist die Methode.

 /**
     * use this method to highlight a text in TextView
     *
     * @param tv              TextView or Edittext or Button (or derived from TextView)
     * @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 {
                // set color here
                wordToSpan.setSpan(new BackgroundColorSpan(0xFFFFFF00), ofe, ofe + textToHighlight.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
            }
        }
    }

Sie können diese Antwort überprüfen auf anklickbaren hervorgehobenen Text.

0
Khemraj

Ich weiß, dass dieser Thread alt ist, aber nur für den Fall, dass jemand Zeichenfolgen in einer Textansicht hervorheben möchte, habe ich eine Bibliothek erstellt, die genau dies tut. Dies ist meine erste Antwort auf eine Frage zum Stapelüberlauf, da ich gerade beigetreten bin, hoffentlich ist sie richtig und relevant formatiert. Es verwendet SpannableString und findet alle Vorkommen einer von Ihnen angegebenen Zeichenfolge. Darüber hinaus ist ein benutzerdefiniertes ClickableSpan integriert, mit dem Sie bei Bedarf Listener für angeklickten Text einrichten können.

Linker

Lightweight Android Bibliothek zum Hervorheben von Strings in einer Textansicht (Groß-/Kleinschreibung wird ignoriert), mit optionalen Rückrufen.

Sprache: Java

MinSDK: 17

Ein Bild der Funktionalität und des gesamten Codes finden Sie hier .

JavaDocs

Um das Artefakt in Ihr Android Projekt zu bringen, implementieren Sie es:

In der Projektebene build.gradle

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

In der App-Ebene build.gradle

       dependencies {
            implementation 'com.github.Gaineyj0349:Linker:1.2'
    }

Wie benutzt man:

1 - Konstruieren Sie ein Linker-Objekt mit einer Textansicht:

        Linker linker = new Linker(textView);

2 - Fügen Sie ein Array oder eine Liste von Zeichenfolgen hinzu, die im Text der Textansicht hervorgehoben werden sollen:

        ArrayList<String> list = new ArrayList<>();
        list.add("hello");
        list.add("world");
        linker.addStrings(list);

UND/ODER

        String[] words = new String[]{"One", "Two", "Three"};
        linker.addStrings(words);

3 - Rückruf hinzufügen: (dies ist optional):

       linker.setListener(new LinkerListener() {
            @Override
            public void onLinkClick(String charSequenceClicked) {

                // charSequenceClicked is the Word that was clicked

                Toast.makeText(MainActivity.this, charSequenceClicked, Toast.LENGTH_SHORT).show();
            }
        });

4 - Rufen Sie die Aktualisierungsmethode des Linkers auf, um die Anpassung zu bestätigen und das Setup zu implementieren:

        linker.update();

Sie haben immer die Möglichkeit, dem Linker-Objekt Strings hinzuzufügen. Rufen Sie einfach die update-Methode auf, um die Bereiche zu aktualisieren.

    linker.addStrings("yoda");
    linker.update();

Wenn Sie einen neuen Slate mit demselben Linker-Objekt benötigen, rufen Sie einfach an

       linker.clearLinksList()

Sie können die Links auch anpassen:

1 - Passen Sie alle Linkfarben an:

      linker.setAllLinkColors(Color.BLUE);

2 - Link-Unterstreichungen anpassen:

      linker.setAllLinkUnderline(false);

3 - Wenn Sie eine Farb- oder Unterstreichungseinstellung für eine bestimmte Zeichenfolge anpassen möchten (beachten Sie, dass die Zeichenfolge bereits zum Linker hinzugefügt werden muss):

      linker.setLinkColorForCharSequence("world", Color.Magenta);
      linker.setUnderlineModeForCharSequence("world", true);

4 - Wenn Sie für jedes Word verschiedene Setups verwenden möchten, können Sie dem Linker-Objekt auch eine Liste oder ein Array von LinkProfiles geben:

        ArrayList<LinkProfile> profiles = new ArrayList<>();
        profiles.add(new LinkProfile("hello world",
                Color.GREEN, false));
        profiles.add(new LinkProfile("goodbye cruel world",
                Color.RED, false));
        profiles.add(new LinkProfile("Whoa awesome!",
                Color.CYAN, true));


        linker.addProfiles(profiles);

Denken Sie daran, .update () nach allen Hinzufügungen zum Linker-Objekt aufzurufen.

Beachten Sie, dass sich die Bibliothek um Feinheiten wie das Hinzufügen von zwei gleichen Wörtern oder gleichen Teilen eines Wortes kümmert. Wenn zum Beispiel "helloworld" und "hello" zwei der Wörter sind, die dem Linker hinzugefügt wurden, wird "helloworld" der Vorzug vor "hello" gegeben, wenn sie sich im selben Zeichenbereich befinden. Der Linker sortiert zuerst nach größeren Wörtern und zeichnet alle Bereiche auf, während er sie verknüpft. Dies vermeidet das Problem der Duplizierung und der Überschneidung von Bereichen.

Lizenziert unter MIT Lizenz.

0
Joshua Gainey

Sie tun dies in xml strings, wenn Ihre Zeichenfolgen statisch sind

<string name="my_text">This text is <font color='red'>red here</font></string>
0
Isaac Sekamatte