Android และ & nbsp; ใน TextView


109

เป็นไปได้ไหมที่จะเพิ่ม ใน TextView มีใครทำได้เหมือนกันบ้าง

ฉันต้องการมีพื้นที่ว่างที่ไม่แตกหักใน TextView

คำตอบ:


185

TextViewเคารพอักขระ Unicode no-break space ( \u00A0) ซึ่งจะเป็นวิธีแก้ปัญหาที่ง่าย / เบากว่า HTML


3
ที่ใช้งานได้ดี คุณสามารถเพิ่มสิ่งนั้นใน xml หรือในโค้ด java ทำงานได้ดีในโค้ด java ใน xml ฉันยังไม่ได้ทดสอบมากนัก แต่ควรทำงานได้ดี
Mikooos

ทั้ง \ u0020 หรือ \ u00A0 ไม่ทำงาน ไม่ว่าจะโดยการตั้งค่าใน XML (ไม่ใช่ในการแสดงตัวอย่างใน XML) หรือโดยการตั้งค่าใน Java ด้วย setText () ลองทั้งกับ Android 4.1 และ 4.2
Stephan Wiesner

1
ไม่สามารถใช้ร่วมกับลูกน้ำ คุณจะได้เส้นแบ่งหลังลูกน้ำในกรณีเช่นนี้
Alex Bonel

1
\ u00A0 ไม่ได้หลอกลวงฉัน มันไม่ได้สร้างช่องว่างเพียงแค่รวมคำ - Android 4.4.4, 5.0, 5.1
Marcel Bro

1
ในคอตลินได้ผลดีมาก ฉันแทนที่ช่องว่างทั้งหมดด้วยสิ่งนี้และมันจะจุดไข่ปลาจากอักขระตัวสุดท้าย str.replace ("", "\ u00A0") ให้ผลตอบแทน "สวัสดีว ... " แทน "สวัสดี ... "
Seop Yoon


24

เป็นไปได้ที่จะใช้ เพื่อให้มีโซลูชันที่อ่านได้ การรวม\u00A0หรือ หรือ /  ในข้อความไม่ได้ให้ข้อมูลมากนักกับผู้อ่านซอร์สโค้ด (หรือตัวแปลสำหรับเรื่องนั้น) เว้นแต่คุณจะจำรหัสฐานสิบหก นี่คือวิธีใช้เอนทิตีที่มีชื่อในstrings.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY nbsp "&#160;"><!-- non-breaking space, U+00A0 -->
]>
<resources>
    ...
</resources>

สิ่งนี้จะสร้างการประกาศที่ขาดหายไป การประกาศHTMLดั้งเดิมสามารถพบได้ในhttps://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent โดยอ้างอิงจากXHTML DTDsปกติDTDs ทั้งหมดนี้ใช้งานได้เนื่องจากตัวแยกวิเคราะห์ XML อ่านสิ่งเหล่านี้และแทนที่ในขณะที่โหลดไฟล์ดังนั้นเอนทิตีจะไม่ปรากฏในทรัพยากรที่คอมไพล์ผลลัพธ์

&nbsp;ในCharSequenceทรัพยากร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"
    />

อุปกรณ์และตัวอย่าง (การแสดงตัวอย่างไม่รู้จัก HTML)
HTML บนอุปกรณ์ HTML ในการแสดงตัวอย่าง

&nbsp; ในทรัพยากร Android String (จัดรูปแบบ)

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

จากนั้นในรหัส:

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

อุปกรณ์และการแสดงตัวอย่าง (การแสดงตัวอย่างไม่รู้จักเอนทิตีและสตริง Java เป็นข้อความตามตัวอักษร!)
ฟอร์แมตบนอุปกรณ์ จัดรูปแบบในการแสดงตัวอย่าง

เทคนิคเพิ่มเติม

นี่เป็นเพียงตัวอย่างการใช้เอนทิตี DTD ใช้ตามความต้องการของคุณเอง

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

ทั้งสองอย่างช่วยเน้น: เอนทิตี XML ที่ไฮไลต์


Android จัดการกับอักขระได้ดีไม่จำเป็นต้องสร้างเอนทิตีเครื่องหมายอะพอสทรอฟี <string name="original">Don’t wrap %1$s</string>ทำงานได้ตามที่คาดไว้
Diti

1
@Diti นั่นไม่ได้เป็นอัญประกาศเดี่ยวว่าเป็นขวาคำพูดขีดเดียว ; เปรียบเทียบVS' Android ไม่มีปัญหากับอักขระ Unicode ที่สวยงามมากขึ้น แต่มีปัญหากับ ASCII 0x27 ซึ่งจำเป็นต้องหลบหนี เอนทิตีเป็นเพียงสิ่งอำนวยความสะดวกฉันแค่วางไว้ที่นั่นเพื่อแสดงให้เห็นว่ามันมีประโยชน์ตรงไหน
TWiStErRob

ยอดเยี่ยมมาก =) ขอบคุณ ฉันพบว่าสิ่งนี้สะอาดและอ่านง่ายกว่ามาก
Alex Hart

คำตอบที่ดีขอบคุณ! ฉันยอมรับว่าการมี&nbsp;สตริงมีความหมายต่อนักแปลมากกว่ายูนิโคด\u00A0
Marc Attinasi

1
@ เจ็ดแน่นอนดูส่วนสุดท้าย (เทคนิคเพิ่มเติม) ซึ่งเพิ่มconและparam1ในไฟล์เดียวกัน
TWiStErRob

18

TextView ควรเคารพพื้นที่ที่ไม่ทำลาย

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

หรือ

new TextView("Hello\u00A0world");

3

สถานการณ์ที่ไม่เหมือนใครอย่างหนึ่งที่ฉันพบคือการเพิ่มพื้นที่ว่างให้กับทรัพยากรสตริงที่รับString.formatพารามิเตอร์

<resources>
    <string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>

ฉันพยายามคัดลอกและวางอักขระช่องว่างที่ไม่ทำลายลงในสตริงและมันก็ถูกแทนที่ด้วยช่องว่างเก่าปกติหลังจากรวบรวม

การลบformatted = "false" การกำหนดหมายเลข args รูปแบบและการใช้เครื่องหมายแบ็กสแลชใช้ได้ผลสำหรับฉัน:

<resources>
    <string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>

2

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.