Entfernen Sie zusätzliche Zeilenumbrüche nach Html.fromHtml()

Lesezeit: 4 Minuten

Benutzer-Avatar
AlexCheuk

Ich versuche, HTML in eine TextView zu platzieren. Alles funktioniert perfekt, das ist mein Code.

String htmlTxt = "<p>Hellllo</p>"; // the html is form an API
Spanned html = Html.fromHtml(htmlTxt);
myTextView.setText(html);

Dies setzt meine TextView mit dem richtigen HTML. Aber mein Problem ist, mit einem

-Tag im HTML-Code hat der Ergebnistext, der in die TextView geht, ein “\n” am Ende, sodass die Höhe meiner TextView höher wird, als sie sein sollte.

Da es sich um eine Spanned-Variable handelt, kann ich keine Regex-Ersetzung anwenden, um das “\n” zu entfernen, und wenn ich es in eine Zeichenfolge umwandeln und dann Regex anwenden würde, verliere ich die Funktionalität, dass HTML-Anker ordnungsgemäß funktionieren.

Kennt jemand Lösungen, um die Endzeilenumbrüche aus einer “Spanned” -Variablen zu entfernen?

  • Können Sie tatsächliche HTML-Zeilenumbrüche verwenden (<br/>) stattdessen? Sie können den Zeilenumbruch vor dem Text platzieren und nichts danach, also ist es:
    Helllllllloooo , was ihm einen Umbruch über dem Text gibt, aber nichts darunter.

    – Ben Ashton

    6. März 2012 um 18:09 Uhr

  • @Ben, die HTML-Rückgabe stammt von einer API und ich habe keine Kontrolle darüber.

    – AlexCheuk

    6. März 2012 um 19:06 Uhr

  • Vielleicht mit TextUtils.getTrimmedLength() würde funktionieren. Es gibt eine Menge anderer Funktionen in TextUtils das kann dir helfen das problem zu lösen…

    – Salil Pandit

    6. März 2012 um 19:19 Uhr


  • Ich habe heute damit gekämpft. Die Antworten unten funktionieren gut, da ich meine eigenen geschrieben habe. Das Problem ist, wenn

    -Tags nicht nur am Ende, sondern an anderer Stelle im Text stehen. Die einzige Möglichkeit, dies zu tun, besteht darin, in eine Zeichenfolge zu konvertieren und .replace (…) auszuführen, aber dann verlieren Sie Ihre gesamte Formatierung.

    – JonWillis

    21. September 2012 um 16:08 Uhr

  • Überprüfen Sie dies auch, sehr einfach und funktioniert;) stackoverflow.com/a/24553061/2626219

    – Hamid Qasemy

    3. Juli 2014 um 12:01 Uhr

Gute Antwort @Christine. Ich habe heute Nachmittag eine ähnliche Funktion geschrieben, um abschließende Leerzeichen aus einer CharSequence zu entfernen:

/** Trims trailing whitespace. Removes any of these characters:
 * 0009, HORIZONTAL TABULATION
 * 000A, LINE FEED
 * 000B, VERTICAL TABULATION
 * 000C, FORM FEED
 * 000D, CARRIAGE RETURN
 * 001C, FILE SEPARATOR
 * 001D, GROUP SEPARATOR
 * 001E, RECORD SEPARATOR
 * 001F, UNIT SEPARATOR
 * @return "" if source is null, otherwise string with all trailing whitespace removed
 */
public static CharSequence trimTrailingWhitespace(CharSequence source) {

    if(source == null)
        return "";

    int i = source.length();

    // loop back to the first non-whitespace character
    while(--i >= 0 && Character.isWhitespace(source.charAt(i))) {
    }

    return source.subSequence(0, i+1);
}

  • Dies ist ein Ort, an dem IMO a do-while ist besser lesbar als a while: do { --i; } while (i >= 0 && Character.isWhitespace(cs.charAt(i))) (Offensichtlich, teilen Sie es in mehrere Zeilen auf – StackOverflow lässt mich das nicht in einem Kommentar tun)

    – Vicky Chijwani

    17. Januar 2016 um 5:42 Uhr

  • Ich hatte Probleme mit CharSequence, also musste ich es als Spanned zurückwerfen, zB temp = (Spanned) temp.subSequence(0, temp.length() – 2); // hat “\n\n” am Ende

    – Benutzer1228123

    10. April 2018 um 21:27 Uhr


Benutzer-Avatar
Christine

Das Spannable ist eine CharSequence, die Sie manipulieren können.

Das funktioniert:

    myTextView.setText(noTrailingwhiteLines(html));

    private CharSequence noTrailingwhiteLines(CharSequence text) {

        while (text.charAt(text.length() - 1) == '\n') {
            text = text.subSequence(0, text.length() - 1);
        }
        return text;
    }

  • Dies ist ziemlich ineffizient für SpannableStrings, als subSequence() schafft ein ganz neues SpannableString Objekt. Die akzeptierte Antwort ist viel besser.

    – Vicky Chijwani

    17. Januar 2016 um 5:35 Uhr

  • Wenn Sie zwischen Programmierzeit, Lesbarkeit des Codes und Programmeffizienz abwägen, hängt es von den Umständen ab, welche Version besser ist. Ich halte die Programmeffizienz für den am wenigsten relevanten Parameter, es sei denn, Ihr Code wird tausendmal pro Sekunde auf Millionen von Geräten ausgeführt.

    – Christine

    17. Januar 2016 um 12:58 Uhr

Benutzer-Avatar
Juan Ocampo

Sie können dies versuchen:

Spanned htmlDescription = Html.fromHtml(textWithHtml);
String descriptionWithOutExtraSpace = new String(htmlDescription.toString()).trim();

textView.setText(htmlDescription.subSequence(0, descriptionWithOutExtraSpace.length()));

  • Verlieren Sie nicht die Spannen, indem Sie das Spanned-Objekt in String konvertieren?

    – Sake

    7. März 2017 um 16:20 Uhr

  • @Saket Sie geben den getrimmten String nicht zurück, Sie erstellen eine subSequence der überspannten charSequence mit der Länge des getrimmten Strings. Du verlierst nicht die Spannen.

    – Mavamaarten

    28. April 2017 um 9:14 Uhr

  • das würde aber nicht funktionieren, wenn es führende Leerzeichen gäbe, oder? trim() entfernt sowohl führende als auch nachgestellte Leerzeichen

    – raquelhortab

    15. April 2020 um 9:23 Uhr

  • @raquelhortab Sie können die trimEnd-Funktion verwenden. Es hat für mich funktioniert.

    – Chathura Madhushanka

    4. August um 3:23

Sie können diese Zeilen verwenden … funktioniert total 😉

Ich weiß, dass Ihr Problem gelöst ist, aber vielleicht findet das jemand nützlich.

try{
        string= replceLast(string,"<p dir=\"ltr\">", "");
        string=replceLast(string,"</p>", "");
}catch (Exception e) {}

und hier ist replaceLast …

public String replceLast(String yourString, String frist,String second)
{
    StringBuilder b = new StringBuilder(yourString);
    b.replace(yourString.lastIndexOf(frist), yourString.lastIndexOf(frist)+frist.length(),second );
    return b.toString();
}

1225410cookie-checkEntfernen Sie zusätzliche Zeilenumbrüche nach Html.fromHtml()

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy