Odpowiedzi:
TextView
szanuje znak spacji Unicode ( \u00A0
), który byłby prostszym / lżejszym rozwiązaniem niż HTML.
\u00A0
jest spacją nierozdzielającą, \u0020
nie jest spacją nierozdzielającą
Możliwe jest użycie
czytelnego rozwiązania. Łącznie \u00A0
lub  
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 " "><!-- 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.
w CharSequence
zasobach Android Text ( )<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this 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)
w zasobach Android String (sformatowane)<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is 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 ");
((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!)
To tylko przykładowe zastosowania jednostek DTD, używaj ich na podstawie własnych preferencji.
<!ENTITY con "\'"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
Sadly ' cannot be overridden due to XML spec:
https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "%1$s"><!-- format string argument #1 -->
<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap ¶m1;</string>
’
postacią, nie ma potrzeby tworzenia apostrofów. <string name="original">Don’t wrap %1$s</string>
działa zgodnie z oczekiwaniami.
'
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.
w smyczkach jest dla tłumaczy o wiele bardziej znaczące niż unicode\u00A0
con
i param1
w tym samym pliku.
Jedyną wyjątkową sytuacją, na którą się natknąłem, było dodanie nierozdzielającej spacji do zasobu ciągu, który pobierał String.format
parametry.
<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>
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);
}