Android i & nbsp; w TextView

108

czy można dodać  w TextView? Czy ktoś osiągnął podobną funkcjonalność?

Chcę mieć nierozerwalną przestrzeń w TextView.

Mikooos
źródło

Odpowiedzi:

184

TextViewszanuje znak spacji Unicode ( \u00A0), który byłby prostszym / lżejszym rozwiązaniem niż HTML.

Dan Dyer
źródło
3
To działa świetnie. Możesz dodać to do xml lub w kodzie java. Działa dobrze w kodzie java, w xml nie testowałem za dużo, ale powinno wystarczyć.
Mikooos
Ani \ u0020, ani \ u00A0 nie działają. Ani przez ustawienie ich w XML (nawet w podglądzie w XML), ani przez ustawienie ich w Javie za pomocą setText (). Próbowałem zarówno z Androidem 4.1, jak i 4.2
Stephan Wiesner,
1
To nie działa w połączeniu z przecinkiem. W takich przypadkach po przecinku pojawia się znak końca wiersza
Alex Bonel
1
\ u00A0 mi nie wystarcza. Nie tworzy spacji, po prostu łączy słowa - Android 4.4.4, 5.0, 5.1
Marcel Bro
1
W Kotlinie działa bardzo dobrze. Zastępuję wszystkie puste miejsca tym, a to elipsa od ostatnich znaków. str.replace („”, „\ u00A0”) zwraca „Hello wor ...” zamiast „Hello ...”
Seop Yoon
24

\u00A0jest spacją nierozdzielającą, \u0020nie jest spacją nierozdzielającą

Brenagwynn
źródło
24

Możliwe jest użycie  czytelnego rozwiązania. Łącznie \u00A0lub  lub  /  w tekst nie naprawdę przekazać wiele informacji do czytnika kodu źródłowego (lub tłumacza dla tej sprawy), chyba pamiętacie kody HEX. Oto sposób użycia nazwanej jednostki w strings.xml:

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

Spowoduje to utworzenie brakującej deklaracji. Oryginalną deklarację HTML można znaleźć w https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent, do którego odwołuje się zwykłe DTD XHTML . Wszystko to działa, ponieważ parser XML odczytuje je i zastępuje podczas ładowania pliku, więc jednostka nie będzie obecna w wynikowych skompilowanych zasobach.

&nbsp;w CharSequencezasobach Android Text ( )

<!-- 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"
    />

Urządzenie i podgląd (podgląd nie rozpoznaje HTML)
HTML na urządzeniu HTML w podglądzie

&nbsp; w zasobach Android String (sformatowane)

<!-- 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"
    />

Następnie w kodzie:

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

Urządzenie i podgląd (wersja zapoznawcza nie rozpoznaje jednostek, a ciągi Java to dosłowny tekst!)
sformatowany na urządzeniu sformatowany w podglądzie

Dalsze sztuczki

To tylko przykładowe zastosowania jednostek DTD, używaj ich na podstawie własnych preferencji.

<!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>

Oba pomagają podkreślić: wyróżnione encje XML

TWiStErRob
źródło
Android dobrze radzi sobie z postacią, nie ma potrzeby tworzenia apostrofów. <string name="original">Don’t wrap %1$s</string>działa zgodnie z oczekiwaniami.
Diti,
1
@Diti To nie jest APOSTROFA , to PRAWIDŁOWY POJEDYNCZY ZNAK CYTATU ; porównać 'VS . Android nie ma problemów z bardziej wymyślnymi znakami Unicode, ale ma problem z ASCII 0x27, który wymaga ucieczki. Istota jest tylko wygodą, po prostu umieściłem ją tam, aby pokazać, gdzie może być przydatna.
TWiStErRob
To jest doskonałe =) Dziękuję. Uważam, że jest to o wiele czystsze i łatwiejsze do odczytania.
Alex Hart
Świetna odpowiedź, dziękuję! Zgadzam się, że posiadanie &nbsp;w smyczkach jest dla tłumaczy o wiele bardziej znaczące niż unicode\u00A0
Marc Attinasi,
1
@ Siedem oczywiście, zobacz ostatnią sekcję (Dalsze triki), która dodaje coni param1w tym samym pliku.
TWiStErRob
18

TextView powinien uwzględniać nierozdzielającą spację

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

lub

new TextView("Hello\u00A0world");
rds
źródło
3

Jedyną wyjątkową sytuacją, na którą się natknąłem, było dodanie nierozdzielającej spacji do zasobu ciągu, który pobierał String.formatparametry.

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

Próbowałem po prostu skopiować i wkleić nierozdzielający znak spacji do ciągu i został on zastąpiony zwykłą starą spacją po kompilacji.

Usunięcie formatted = "false" , numerowanie argumentów formatu i użycie notacji z odwrotnym ukośnikiem zadziałało dla mnie:

<resources>
    <string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>
Jon
źródło
2

To zadziałało dla mnie:

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
źródło
1

To jest przykład użycia nbsp w TextView

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

kameny
źródło
4
To powinno być \ u00A0
poitroae