Android und & nbsp; in TextView

108

ist es möglich,  in TextView hinzuzufügen ? Hat jemand ähnliche Funktionen erreicht?

Ich möchte nicht unterbrechbaren Speicherplatz in TextView haben.

Mikooos
quelle

Antworten:

184

TextViewrespektiert das Unicode-Leerzeichen ( \u00A0) ohne Unterbrechung , das eine einfachere / leichtere Lösung als HTML wäre.

Dan Dyer
quelle
3
Das funktioniert super. Sie können das zu XML oder in Java-Code hinzufügen. Funktioniert gut in Java-Code, in XML habe ich nicht zu viel getestet, aber es sollte den Job machen.
Mikooos
Weder \ u0020 noch \ u00A0 funktionieren. Weder durch Festlegen in XML (nicht einmal in der Vorschau in XML) noch durch Festlegen in Java mit setText (). Versuchte beide mit Android 4.1 und 4.2
Stephan Wiesner
1
Das funktioniert nicht in Verbindung mit Komma. In solchen Fällen erhalten Sie einen Zeilenumbruch direkt nach dem Komma
Alex Bonel
1
\ u00A0 macht den Trick nicht für mich. Es macht kein Leerzeichen, verbindet nur die Wörter - Android 4.4.4, 5.0, 5.1
Marcel Bro
1
In Kotlin funktioniert es sehr gut. Ich ersetze alle Leerzeichen durch diese, und es wird eine Ellipsengröße von den letzten Zeichen. str.replace ("", "\ u00A0") ergibt "Hallo wor ..." anstelle von "Hallo ..."
Seop Yoon
24

\u00A0ist ein nicht brechender Raum, \u0020ist kein nicht brechender Raum

Brenagwynn
quelle
24

Es ist möglich,  eine lesbare Lösung zu haben. Das Einfügen \u00A0oder  oder  / oder  in den Text vermittelt dem Leser des Quellcodes (oder dem Übersetzer) nicht wirklich viele Informationen, es sei denn, Sie erinnern sich an die Hex-Codes. Hier ist eine Möglichkeit, die benannte Entität zu verwenden in strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY nbsp "&#160;"><!-- non-breaking space, U+00A0 -->
]>
<resources>
    ...
</resources>

Dadurch wird die fehlende Deklaration erstellt. Die ursprüngliche HTML- Deklaration finden Sie unter https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent, auf die von den üblichen XHTML-DTDs verwiesen wird . All dies funktioniert, da der XML-Parser diese beim Laden der Datei liest und ersetzt, sodass die Entität in den resultierenden kompilierten Ressourcen nicht vorhanden ist.

&nbsp;in Android Text ( CharSequence) Ressourcen

<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this&nbsp;name</b></string>

<!-- Used in a layout -->
<TextView
    android:layout_width="130dp"
    android:layout_height="wrap_content"
    android:background="#10000000"
    android:text="@string/html_text"
    />

Gerät und Vorschau (Vorschau erkennt HTML nicht)
HTML auf dem Gerät HTML in der Vorschau

&nbsp; in Android String (formatiert) Ressourcen

<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is&nbsp;nice</string>

<!-- Used in a layout -->
<TextView
    android:layout_width="130dp"
    android:layout_height="wrap_content"
    android:background="#10000000"
    tools:text="@string/formatted_text"
    />

Dann im Code:

String contents = getString(R.string.formatted_text, "Using an &nbsp;");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);

Gerät und Vorschau (Vorschau erkennt keine Entitäten und Java-Zeichenfolgen sind wörtlicher Text!)
auf dem Gerät formatiert in der Vorschau formatiert

Weitere Tricks

Dies sind nur beispielhafte Verwendungen von DTD-Entitäten. Verwenden Sie diese nach Ihren Wünschen.

<!ENTITY con "\&apos;"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
                            Sadly &apos; cannot be overridden due to XML spec:
                            https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "&#37;1$s"><!-- format string argument #1 -->

<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap &param1;</string>

Beide helfen beim Hervorheben: hervorgehobene XML-Entitäten

TWiStErRob
quelle
Android verarbeitet den Charakter einwandfrei, es müssen keine Apostroph-Entitäten erstellt werden. <string name="original">Don’t wrap %1$s</string>funktioniert wie erwartet.
Diti
1
@Diti Das ist kein APOSTROPHE , das ist ein RIGHT SINGLE QUOTATION MARK ; Vergleichen 'VS . Android hat keine Probleme mit ausgefalleneren Unicode-Zeichen, aber es hat ein Problem mit ASCII 0x27, das maskiert werden muss. Die Entität ist nur eine Annehmlichkeit, ich habe sie nur dort abgelegt, um zu demonstrieren, wo sie nützlich sein könnte.
TWiStErRob
Das ist ausgezeichnet =) Danke. Ich finde das viel sauberer und leichter zu lesen.
Alex Hart
Tolle Antwort, danke! Ich bin damit einverstanden, dass &nbsp;das \u00A0
Einfügen
1
@Seven natürlich siehe letzter Abschnitt (Weitere Tricks), der conund param1in derselben Datei hinzufügt .
TWiStErRob
18

Die Textansicht sollte den nicht unterbrechenden Bereich berücksichtigen

<string name="test">Hello&#160;world</string>

oder

new TextView("Hello\u00A0world");
rds
quelle
3

Eine einzigartige Situation, in die ich geriet, war das Hinzufügen eines nicht unterbrechenden Leerzeichens zu einer Zeichenfolgenressource, die String.formatParameter verwendete.

<resources>
    <string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>

Ich habe versucht, das nicht unterbrechende Leerzeichen einfach zu kopieren und in die Zeichenfolge einzufügen. Nach dem Kompilieren wurde es durch ein normales altes Leerzeichen ersetzt.

Das Entfernen des formatierten = "false" , das Nummerieren der Formatargumente und die Verwendung der Backslash-Notation haben bei mir funktioniert:

<resources>
    <string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>
Jon
quelle
2

Das hat bei mir funktioniert:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    textview.setText(Html.fromHtml(your string, Html.FROM_HTML_MODE_LEGACY));
} else {
    textview.setText(Html.fromHtml(your string);
}
Madhan Sekar
quelle
1

Dies ist ein Beispiel für die Verwendung von nbsp in einer Textansicht

<string name="text">Example:\u00A0</string>

kamy
quelle
4
Das sollte \ u00A0
poitroae