Android dan & nbsp; di TextView

108

apakah mungkin untuk menambahkan  TextView? Adakah yang mencapai fungsi serupa?

Saya ingin memiliki ruang yang tidak dapat dipecahkan di TextView.

Mikooos
sumber

Jawaban:

184

TextViewmenghormati karakter spasi tanpa jeda Unicode ( \u00A0), yang akan menjadi solusi yang lebih sederhana / lebih ringan daripada HTML.

Dan Dyer
sumber
3
Itu bekerja dengan baik. Anda dapat menambahkannya ke xml atau dalam kode java. Bekerja dengan baik dalam kode java, di xml saya belum menguji terlalu banyak, tetapi harus melakukan pekerjaan itu.
Mikooos
Tidak ada \ u0020 atau \ u00A0 yang berfungsi. Baik dengan menyetelnya dalam XML (bahkan tidak dalam pratinjau dalam XML) maupun dengan menyetelnya di Java dengan setText (). Mencoba keduanya dengan Android 4.1 dan 4.2
Stephan Wiesner
1
Itu tidak berfungsi jika digabungkan dengan koma. Anda mendapatkan jeda baris tepat setelah koma dalam kasus seperti itu
Alex Bonel
1
\ u00A0 tidak berhasil untuk saya. Itu tidak membuat spasi, hanya menggabungkan kata-kata - Android 4.4.4, 5.0, 5.1
Marcel Bro
1
Di Kotlin, ini bekerja dengan sangat baik. Saya mengganti semua ruang kosong dengan ini, dan itu akan menjadi elips dari karakter terakhir. str.replace ("", "\ u00A0") menghasilkan, "Hello wor ..." bukannya "Hello ..."
Seop Yoon
24

\u00A0adalah ruang yang tidak terputus, \u0020bukan ruang yang tidak terputus

Brenagwynn
sumber
24

Dimungkinkan untuk menggunakan  solusi yang dapat dibaca. Menyertakan \u00A0atau  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 "&#160;"><!-- 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.

&nbsp;di Android Text ( CharSequence) Resources

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

Perangkat dan pratinjau (pratinjau tidak mengenali HTML)
HTML di perangkat HTML dalam pratinjau

&nbsp; di Sumber Daya Android String (diformat)

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

Kemudian di kode:

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

Perangkat dan pratinjau (pratinjau tidak mengenali entitas dan string Java adalah teks literal!)
diformat di perangkat diformat dalam pratinjau

Trik lebih lanjut

Ini hanyalah contoh penggunaan entitas DTD, gunakan berdasarkan preferensi Anda sendiri.

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

Keduanya membantu menyoroti: entitas XML yang disorot

TWiStErRob
sumber
Android menangani karakter dengan baik, tidak perlu membuat entitas apostrof. <string name="original">Don’t wrap %1$s</string>bekerja seperti yang diharapkan.
Diti
1
@Diti Itu bukan APOSTROPHE , itu TANDA KUTIPAN TUNGGAL ; membandingkan '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.
TWiStErRob
Ini luar biasa =) Terima kasih. Saya merasa ini jauh lebih bersih dan lebih mudah dibaca.
Alex Hart
Jawaban yang bagus, terima kasih! Saya setuju bahwa memiliki &nbsp;string jauh lebih berarti bagi penerjemah daripada unicode\u00A0
Marc Attinasi
1
@ Tujuh tentu saja, lihat bagian terakhir (Trik lebih lanjut) yang menambahkan condan param1di file yang sama.
TWiStErRob
18

TextView harus menghormati ruang non breaking

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

atau

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

Satu situasi unik yang saya hadapi adalah menambahkan ruang non-breaking ke sumber daya string yang mengambil String.formatparameter.

<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>
Jon
sumber
2

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);
}
Madhan Sekar
sumber
1

Ini adalah contoh yang menggunakan nbsp dalam TextView

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

kameny
sumber
4
Seharusnya \ u00A0
poitroae