วิธีเพิ่มตัวแบ่งบรรทัดใน Android TextView


157

ฉันพยายามเพิ่มตัวแบ่งบรรทัดใน TextView

ฉันพยายามแนะนำ \ n แต่ไม่ได้ทำอะไรเลย นี่คือวิธีการตั้งค่าตำราของฉัน

TextView txtSubTitle = (TextView)findViewById(r.id.txtSubTitle);
txtSubTitle.setText(Html.fromHtml(getResources().getString(R.string.sample_string)));

นี่คือสตริงของฉัน: <string name="sample_string">some test line 1 \n some test line 2</string>

ควรแสดงดังนี้:

some test line 1
some test line 2

some test line 1 some test line 2แต่มันก็แสดงให้เห็นชอบโดย:

ฉันพลาดอะไรไปรึเปล่า?


คุณตั้งค่า android: บรรทัดเป็นอย่างน้อย 2 หรือไม่
Robby Pond

คำบรรยายของฉันไปถึง 6-9 บรรทัดแล้วและมันจะตัดข้อความไปยังบรรทัดถัดไป แต่ถ้าฉันต้องการแตกมันจะไม่หยุด
dropsOfJupiter

คุณควรโพสต์โซลูชันเป็นคำตอบและยอมรับเพื่อให้ผู้อื่นสามารถโหวตได้!
bigstones

1
ฉันสร้างโครงการตัวอย่างขนาดเล็กเพื่อแสดงวิธีต่างๆในการเข้ารหัส linebreaks และผลข้างเคียง สปอยเลอร์: \nเป็นวิธีที่ดีที่สุด github.com/paour/StringResourceTest
Pierre-Luc Paour

ทำไมคำถามนี้ถึงโหวตขึ้น คุณดูมันทั้งหมดหรือไม่ การแก้ปัญหาคือง่ายมากเพียงแค่เอาว่าฟังก์ชั่นการใช้งานและก็Html.fromHtml() txtSubTitle.setText(getResources().getString(R.string.sample_string))
บั๊กเกิดขึ้น

คำตอบ:


222

\n ได้ผลสำหรับฉันเช่นนี้

<TextView android:text="First line\nNext line"

87
เพียงแค่\nการทำงานจะอยู่คนเดียว ... ไม่คิดว่า\rได้ทำอะไรเลย
ปีเตอร์ Ajtai

5
\ r \ n เป็นตัวแบ่งบรรทัดสำหรับ windows และ \ n เป็นตัวแบ่งบรรทัดสำหรับ linux
Guilherme Torres Castro

มันไม่ทำงานสำหรับฉัน <TextView android: layout_width = "50dp" android: layout_height = "70dp" android: layout_weight = "1" android: พื้นหลัง = "@ drawable / keypad1" android: แรงโน้มถ่วง = "ศูนย์" android: text = " 2 ABC "/>
AndroidRaji

1
ทำให้เข้าใจผิดที่ไม่ได้กล่าวถึงการเปลี่ยนแปลงอื่น ๆ ที่คุณทำซึ่งเป็นการเพิ่มเครื่องหมายคำพูดรอบ ๆ สตริง
แพทริค

2
'\ r' แสดงเป็น 'r' ในข้อความ ดังนั้นตามที่คนอื่นแนะนำ '\ n' ทำเคล็ดลับ
Miha Markic

93

ตกลงคิดออก:

<string name="sample_string"><![CDATA[some test line 1 <br />some test line 2]]></string>

ดังนั้นจำเป็นต้องห่อใน CDATA และเพิ่มตัวแบ่งเป็นแท็ก html


3
ใช้สิ่งนี้ในทรัพยากรสตริง & # xa; ชอบ "สวัสดี! บรรทัดแรก! & # xa; นี่คือบรรทัดที่สอง"
RexSplode

3
สิ่งนี้ต้องการการใช้Html.fromHtml()งานซึ่งค่อนข้างมากสำหรับ linebreak แบบง่าย ๆ และไม่ได้รับการสนับสนุนจากผู้ให้บริการการแปล
Pierre-Luc Paour

มาที่คนอย่างจริงจัง? คุณไม่พบปัญหาในคำถามของเขา?
บั๊กเกิดขึ้น

68

Android เวอร์ชัน 1.6 ไม่รู้จัก \ r \ n ใช้: System.getProperty ("line.separator" แทน)

String s = "Line 1"
           + System.getProperty ("line.separator")
           + "Line 2"
           + System.getProperty ("line.separator");

3
Upvote! สิ่งนี้ได้ผลสำหรับฉัน! หากคุณต้องการเพิ่มตัวแบ่งบรรทัดในรูปแบบ: textView.setText (string1 + System.getProperty ("line.separator") + string2); จากนั้นก็ใช้งานได้ดีขอบคุณ!
วงกลมสองรอบ

วัด? มีรุ่น Android ใช้ Windows?
maaartinus

3
สำหรับทุกคนที่ใช้ Xamarin นี่เทียบเท่า: Java.Lang.JavaSystem.LineSeparator ()
Steve

1
ทำไมไม่เพียงแค่ System.lineSeparator ()
George Z.

60

Linebreaks (\ n) ใช้งานได้เฉพาะถ้าคุณใส่ค่าสตริงทรัพยากรของคุณในเครื่องหมายคำพูดเช่นนี้:

<string name="sample_string">"some test line 1 \n some test line 2"</string>

มันจะไม่ทำ linebreaks ถ้าคุณใส่โดยไม่มีเครื่องหมายคำพูดเช่นนี้:

<string name="sample_string">some test line 1 \n some test line 2</string>

ใช่มันง่ายมาก


3
ฉันแค่อยากจะเพิ่มว่าคำพูดสิ่งนี้ยังทำงานได้ดีกับตัวละครพิเศษในทรัพยากรสตริงหรือกับภาษาเช่นกรีกหรือรัสเซีย ... (หากคุณพบปัญหาใด ๆ )
datayeah

1
ขอบคุณฉันคิดว่าการใช้อัญประกาศเป็นวิธีที่ดีกว่าในการรักษาความสามารถในการอ่านสำหรับข้อความหลายบรรทัดที่ยาว <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
xinthink

1
การใช้อัญประกาศมีผลข้างเคียงอื่น ๆ เช่นการเว้นวรรคสำคัญเสมอ (โดยไม่ใส่เครื่องหมายอัญประกาศหลายช่องว่างในแถวเช่นในการเยื้องจะถูกยุบ)
Pierre-Luc Paour

33

พยายามทั้งหมดข้างต้นได้ทำการวิจัยของฉันเองทำให้ได้วิธีแก้ปัญหาดังต่อไปนี้สำหรับการเรนเดอร์ตัวอักษร linefeed escape:

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. โดยใช้วิธีการแทนที่คุณจะต้องกรองหนี linefeeds (เช่น '\\ n')

  2. จากนั้นแต่ละอินสแตนซ์ของตัวป้อนบรรทัด '\ n' ตัวหลีกเลี่ยงจะแสดงผลในตัวป้อนบรรทัดจริง

สำหรับตัวอย่างนี้ฉันใช้ฐานข้อมูล noSQL (ScriptDb) ของ Google Apps Scripting กับข้อมูลที่จัดรูปแบบ JSON

ไชโย: D


text.replace ("\\ n", System.getProperty ("line.separator"))
Mussa

18

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

android:text="First \n Second"

2
ตัวอย่างของคุณดูเหมือนว่าจะมีข้อความในทรัพยากรรูปแบบซึ่งไม่มีขนาดใหญ่ (เป็นไปไม่ได้ที่จะ จำกัด วง)
Pierre-Luc Paour

17

มีสองวิธีรอบนี้ หากคุณใช้สตริงเป็นสตริงดิบคุณต้องใช้อักขระขึ้นบรรทัดใหม่ หากคุณใช้เป็น html เช่นการแยกวิเคราะห์ด้วยHtml.fromStringตัวแปรที่สองจะดีกว่า

1) อักขระขึ้นบรรทัดใหม่ \n

<string name="sample> This\nis a sample</string>

2) แท็กบรรทัดใหม่ Html <br>หรือ<br />

<string name="sample> This<br>is a sample</string>

6
ฉันไม่ได้ลงคะแนน แต่ฉันคิดว่ารหัสของคุณผิดที่คุณต้องการ "& lt; br>" แทนที่จะเป็น "<br>" จะไม่ทำงานเนื่องจาก <เป็นสัญลักษณ์ที่สงวนไว้
JPM

<br>, <u>, <b>และแท็กจะได้รับอนุญาตในสายทรัพยากรโดยไม่ต้องหลบหนีและถูกนำมาใช้อย่างถูกต้องโดย<i> TextView.setText(resId)พวกเขาจะถูกปล้นหากใช้Context.getString(resId)ยกเว้นห่อในCDATAส่วน
Pierre-Luc Paour

16

สิ่งนี้ได้ผลสำหรับฉันบางทีบางคนอาจพบว่ามีประโยชน์:

TextView textField = (TextView) findViewById(R.id.textview1);
textField.setText("First line of text" + System.getProperty("line.separator") + "Linija 2");

11

หากคุณใช้ XML เพื่อประกาศการใช้ TextView android:singleLine = "false"หรือใน Java ให้ใช้txtSubTitle.setSingleLine(false);


ไม่นั่นไม่ได้ผล มีส่วนเกี่ยวข้องกับ Html.fromHtml () และทรัพยากรของสตริงหรือไม่
dropsOfJupiter

@dropsOfJupiter: คุณเคยเห็นสิ่งที่ Html.fromHtml () โทรกลับมาไหม? ฉันอยากรู้อยากเห็นกำหนดให้กับสตริงและดูในดีบักเกอร์
กันไป

10

ใช้ Android Studio 0.8.9 \nวิธีเดียวที่ทำงานสำหรับฉันคือการใช้ ไม่ห่อด้วย CDATA <br>หรือหรือ<br />ทำงาน



8

ง่ายมาก: ใช้ "\ n"

    String aString1 = "abcd";
    String aString2 = "1234";
    mSomeTextView.setText(aString1 + "\n" + aString2);

\ n สอดคล้องกับ ASCII ถ่าน 0xA ซึ่งก็คือ 'LF' หรือการป้อนบรรทัด

\ r สอดคล้องกับ ASCII ถ่าน 0xD ซึ่งก็คือ 'CR' หรือการคืนตลับหมึก

วันที่นี้กลับมาจากเครื่องพิมพ์ดีดเครื่องแรกซึ่งคุณสามารถเลือกที่จะทำเพียงแค่การป้อนบรรทัด (และพิมพ์เพียงแค่บรรทัดที่ต่ำกว่า) หรือการป้อนบรรทัด + การส่งคืนบรรทัด (ซึ่งย้ายไปที่จุดเริ่มต้นของบรรทัดด้วย)

บน Android / java \ n สอดคล้องกับ carriage return + line feed เช่นเดียวกับที่คุณจะ 'ทับ' บรรทัดเดียวกัน


6

ลองตรวจสอบการแปลของคุณอีกครั้ง เป็นไปได้คุณพยายามที่จะแก้ไขไฟล์เดียว (แปล) แต่จริง ๆ แล้วใช้โปรแกรมอื่นเช่นเดียวกับในกรณีของฉัน ภาษาของระบบเริ่มต้นเป็นภาษารัสเซียในขณะที่ฉันพยายามแก้ไขการแปลภาษาอังกฤษ

ในกรณีของฉันวิธีแก้ปัญหาการทำงานคือใช้ "\ n" เป็นตัวคั่นบรรทัด:

    <string name="string_one">line one.
    \nline two;
    \nline three.</string>

4

นอกจากนี้คุณสามารถเพิ่ม"&lt;br&#47;&gt;"แทน \ n

เป็นโค้ดที่ใช้ HTML เพื่อค่า <br/>

จากนั้นคุณสามารถเพิ่มข้อความใน TexView:

articleTextView.setText(Html.fromHtml(textForTextView));

Nea อย่าคิดอย่างนั้น Android จะพิมพ์เรื่องไร้สาระจริง ฉันเหนื่อย. มันทำงานได้ดีใน HTML แต่ไม่ใช่ที่นี่โดยเฉพาะอย่างยิ่งเมื่อคุณกำลังทำ Html.fromHTML ("สตริงของฉันจากไฟล์ xml")
dropsOfJupiter

@drops - อย่าลืม toString ==> Html.fromHtml(textForTextView).toString()--- และจากนั้นคุณสามารถทำได้: articleTextView.setText(Html.fromHtml("text before break<br/>text after break").toString());-------- ในคำอื่น ๆ เพียงแค่ใช้<br/>ภายในโดยตรงfromHtml()
Peter Ajtai

&lt;br/>ควรพอเพียงเพื่อให้แน่ใจว่าข้อมูลสไตล์ไม่ได้ถูกปล้น (อ้างอิงจากเอกสารอย่างเป็นทางการ)
jpmcosta

3

คุณสามารถใช้ String-Editor ของ Android Studio มันสร้าง line brakes และสิ่งต่าง ๆ โดยอัตโนมัติ ...


2

ในฐานะที่เป็นHtml.fromHtmlเลิกฉันก็ฉันใช้รหัสนี้จะได้รับ String2 ในบรรทัดถัดไป

textView.setText(fromHtml("String1 <br/> String2"));

.

@SuppressWarnings("deprecation")
    public static Spanned fromHtml(String html){
        Spanned result;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY);
        } else {
            result = Html.fromHtml(html);
        }
        return result;
    }

2

วิธีที่ง่ายที่สุดที่จะทำคือไปที่ค่า / สายอักขระ (ในโฟลเดอร์ทรัพยากรของคุณ)

ประกาศสตริงที่นั่น:

    <string name="example_string">Line 1\Line2\Line n</string>

และในไฟล์ xml เฉพาะของคุณเพียงแค่เรียกสตริงเช่น

    <TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/example_string" />

1

ฉันพบวิธีอื่น: จำเป็นต้องเพิ่มแอตทริบิวต์" android: maxWidth =" 40dp " " แน่นอนว่ามันอาจจะไม่ทำงานอย่างสมบูรณ์แบบ


1

\ n ไม่ทำงานสำหรับฉัน ฉันสามารถแก้ไขปัญหาได้โดยเปลี่ยน xml เป็น text และสร้างคุณสมบัติ textview text ดังด้านล่าง

android:text="Line 1
Line 2
Line 3

DoubleSpace"

หวังว่านี่จะช่วยคนที่พูดว่า \ n ไม่ได้ผลสำหรับพวกเขา


ฉันไม่มั่นใจว่านี่เป็นทางออกที่ดี มีเพียง\nตัวละครที่ซ่อนอยู่ในนั้น
Almo

1

ฉันกำลังอ่านข้อความของฉันจากไฟล์ดังนั้นฉันจึงใช้วิธีที่แตกต่างกันเล็กน้อยเนื่องจากการเพิ่ม \ n ไปยังไฟล์ทำให้เกิด \ n ปรากฏในข้อความ

    final TextView textView = (TextView) findViewById(R.id.warm_up_view);
    StringBuilder sb = new StringBuilder();
    Scanner scanner = new Scanner(getResources().openRawResource(R.raw.warm_up_file));
    while (scanner.hasNextLine()) {
      sb.append(scanner.nextLine());
      sb.append("\n");
    }

    textView.setText(sb.toString());

0

บางทีคุณสามารถใส่lfลงในข้อความ แต่ไม่แสดง? ตรวจสอบให้แน่ใจว่าคุณมีความสูงเพียงพอสำหรับการควบคุม ตัวอย่างเช่น:

แก้ไข:

android:layout_height="wrap_content"

อาจจะผิด:

android:layout_height="10dp"

0

ในกรณีของฉันฉันแก้ไขปัญหานี้โดยเพิ่มสิ่งต่อไปนี้:

android:inputType="textMultiLine"

ประเภทอินพุตใช้สำหรับ EditText ไม่ใช่ TextView
clauziere

0

ลองนี้:

         TextView calloutContent = new TextView(getApplicationContext());
         calloutContent.setTextColor(Color.BLACK);
         calloutContent.setSingleLine(false);
         calloutContent.setLines(2);
         calloutContent.setText(" line 1" + System.getProperty ("line.separator")+"  line2" );

0

ฉันรู้สึกว่าต้องการคำตอบที่สมบูรณ์ยิ่งขึ้นเพื่ออธิบายวิธีการทำงานอย่างละเอียดมากขึ้น

ประการแรกหากคุณต้องการการจัดรูปแบบขั้นสูงให้ตรวจสอบคู่มือการใช้ HTML ในทรัพยากรสตริงในสายทรัพยากร
จากนั้นคุณสามารถใช้<br/>ฯลฯ อย่างไรก็ตามจำเป็นต้องตั้งค่าข้อความโดยใช้รหัส

หากเป็นเพียงข้อความธรรมดามีหลายวิธีในการหลีกเลี่ยงอักขระขึ้นบรรทัดใหม่ (LF) ในสแตติก ทรัพยากรสตริง

การล้อมรอบสตริงด้วยเครื่องหมายคำพูดคู่

วิธีที่สะอาดที่สุดคือใส่สตริงในเครื่องหมายคำพูดคู่
สิ่งนี้จะทำให้ช่องว่างนั้นถูกตีความอย่างแม่นยำตามที่ปรากฏไม่ใช่การยุบ
จากนั้นคุณสามารถใช้การขึ้นบรรทัดใหม่ตามปกติในวิธีนี้ (อย่าใช้การเยื้อง)

<string name="str1">"Line 1.
Line 2.
Line 3."</string>

โปรดทราบว่าตัวละครบางตัวต้องการการหลบหลีกพิเศษในโหมดนี้ (เช่น \" )

ลำดับ escape ด้านล่างนี้ยังทำงานในโหมดที่ยกมา

เมื่อใช้บรรทัดเดียวใน XML เพื่อแสดงสตริงหลายบรรทัด

วิธีที่สง่างามที่สุดที่จะหลบหนีขึ้นบรรทัดใหม่ใน XML อยู่กับจุดรหัส (10 หรือ 0xA ในฐานสิบหก) โดยใช้ XML / นิติบุคคลของ HTML หรือ&#xA; &#10;นี่คือวิธีที่ XML เพื่อหนีตัวอักษรใด
อย่างไรก็ตามดูเหมือนว่าจะใช้งานได้เฉพาะในโหมดที่ยกมา

อีกวิธีหนึ่งคือใช้อย่างง่าย\nๆ แม้ว่ามันจะส่งผลเสียต่อความชัดเจน แต่ในความคิดของฉัน (เนื่องจากไม่ใช่ลำดับการหลบหนีพิเศษใน XML แต่ Android Studio ไม่ได้เน้นเรื่องนี้)

<string name="str1">"Line 1.&#xA;Line 2.&#10;Line 3."</string>
<string name="str1">"Line 1.\nLine 2.\nLine 3."</string>
<string name="str1">Line 1.\nLine 2.\nLine 3.</string>

อย่ารวมบรรทัดใหม่หรือช่องว่างใด ๆ หลังจากลำดับการหลีกเลี่ยงใด ๆ เนื่องจากจะถูกตีความว่าเป็นพื้นที่พิเศษ


-1

ใช้ตัวแบ่งข้อความแบบนี้ (\ n):

<string name="sample_string"><![CDATA[some test line 1 \n some test line 2]]></string>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.