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.

Jawaban:


184

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


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


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


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

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>

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

1

Ini adalah contoh yang menggunakan nbsp dalam TextView

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


4
Seharusnya \ u00A0
poitroae
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.