Android i & nbsp; w TextView


108

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

Chcę mieć nierozerwalną przestrzeń w TextView.

Odpowiedzi:


184

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


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ą


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


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

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>

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

1

To jest przykład użycia nbsp w TextView

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


4
To powinno być \ u00A0
— poitroae
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.