Jawaban:
TextView
menghormati karakter spasi tanpa jeda Unicode ( \u00A0
), yang akan menjadi solusi yang lebih sederhana / lebih ringan daripada HTML.
\u00A0
adalah ruang yang tidak terputus, \u0020
bukan ruang yang tidak terputus
Dimungkinkan untuk menggunakan
solusi yang dapat dibaca. Menyertakan \u00A0
atau  
atau  
/  
dalam teks tidak benar-benar menyampaikan banyak informasi kepada pembaca kode sumber (atau penerjemah dalam hal ini), kecuali Anda mengingat kode hex. Berikut cara untuk menggunakan entitas bernama di strings.xml
:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY nbsp " "><!-- non-breaking space, U+00A0 -->
]>
<resources>
...
</resources>
Ini akan membuat deklarasi yang hilang. Deklarasi HTML asli dapat ditemukan di https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent dirujuk dari XHTML DTD biasa . Semua ini berfungsi, karena pengurai XML membaca ini dan menggantikannya saat memuat file, sehingga entitas tidak akan ada dalam sumber daya terkompilasi yang dihasilkan.
di Android Text ( CharSequence
) Resources<!-- 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"
/>
Perangkat dan pratinjau (pratinjau tidak mengenali HTML)
di Sumber Daya Android String (diformat)<!-- 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"
/>
Kemudian di kode:
String contents = getString(R.string.formatted_text, "Using an ");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);
Perangkat dan pratinjau (pratinjau tidak mengenali entitas dan string Java adalah teks literal!)
Ini hanyalah contoh penggunaan entitas DTD, gunakan berdasarkan preferensi Anda sendiri.
<!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>
’
karakter dengan baik, tidak perlu membuat entitas apostrof. <string name="original">Don’t wrap %1$s</string>
bekerja seperti yang diharapkan.
'
VS ’
. Android tidak memiliki masalah dengan karakter Unicode yang lebih mewah, tetapi memiliki masalah dengan ASCII 0x27, yang perlu keluar. Entitas itu hanya kenyamanan, saya hanya menaruhnya di sana untuk menunjukkan di mana itu bisa berguna.
string jauh lebih berarti bagi penerjemah daripada unicode\u00A0
con
dan param1
di file yang sama.
Satu situasi unik yang saya hadapi adalah menambahkan ruang non-breaking ke sumber daya string yang mengambil String.format
parameter.
<resources>
<string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>
Saya mencoba untuk hanya menyalin dan melewati karakter spasi non-breaking ke dalam string dan diganti dengan spasi lama biasa setelah kompilasi.
Menghapus formatted = "false" , menomori format args dan menggunakan notasi garis miring terbalik berhasil untuk saya:
<resources>
<string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>
Ini berhasil untuk saya:
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);
}