Làm cách nào để thêm ngắt dòng trong TextView của Android?


157

Tôi đang cố gắng thêm một ngắt dòng trong TextView.

Tôi đã thử đề xuất \ n nhưng điều đó không có gì. Đây là cách tôi thiết lập các văn bản của tôi.

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

Đây là Chuỗi của tôi: <string name="sample_string">some test line 1 \n some test line 2</string>

Nó sẽ hiển thị như vậy:

some test line 1
some test line 2

Nhưng nó cho thấy như vậy: some test line 1 some test line 2 .

Tui bỏ lỡ điều gì vậy?


Bạn đã đặt android: lines thành ít nhất 2 chưa?
Robby Pond

Phụ đề của tôi đã có tới 6-9 dòng và nó sẽ ngắt văn bản sang dòng tiếp theo nhưng nếu tôi muốn ngắt thì nó không bị hỏng.
giọtOfJupiter

bạn nên đăng giải pháp của bạn như một câu trả lời và chấp nhận nó, để mọi người có thể nâng cao!
bigstones

1
Tôi đã tạo một dự án mẫu nhỏ để minh họa các cách khác nhau để mã hóa các ngắt dòng và tác dụng phụ của chúng. Spoiler: \nthực sự là cách tốt nhất. github.com/paour/StringResourceTest
Pierre-Luc Paour

Tại sao câu hỏi này được bình chọn như vậy? Bạn đã tìm kiếm nó ở tất cả? Giải pháp rất đơn giản, chỉ cần loại bỏ Html.fromHtml()chức năng đó và chỉ cần sử dụng txtSubTitle.setText(getResources().getString(R.string.sample_string)).
Lỗi xảy ra vào

Câu trả lời:


222

\n làm việc cho tôi, như thế này:

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

87
Chỉ \nmột mình sẽ làm việc ... Đừng nghĩ rằng \rlàm bất cứ điều gì.
Peter Ajtai

5
\ r \ n đó là ngắt dòng cho windows và \ n là ngắt dòng cho linux
Guilherme Torres Castro

nó không hoạt động đối với tôi 2 ABC "/>
AndroidRaji

1
Gây hiểu lầm vì không đề cập đến thay đổi khác mà bạn đã thực hiện đó là thêm dấu ngoặc kép quanh chuỗi.
Patrick

2
'\ r' thực sự hiển thị là 'r' trong văn bản. Vì vậy, như những người khác đề xuất, '\ n' thực hiện thủ thuật.
Miha Markic

92

ok đã tìm ra nó:

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

do đó, bọc trong CDATA là cần thiết và ngắt thêm vào dưới dạng thẻ html


3
Sử dụng tài khoản này trong tài nguyên chuỗi & # xa; Giống như "Xin chào! Dòng đầu tiên! & # Xa; Đây là dòng thứ hai"
RexSplode 20/03/2017

3
Điều này đòi hỏi phải sử dụng Html.fromHtml(), một chút nhiều cho một ngắt dòng đơn giản và không được các nhà cung cấp dịch thuật hỗ trợ tốt.
Pierre-Luc Paour

Thôi nào anh bạn? Bạn không thể tìm thấy vấn đề trong câu hỏi của anh ấy?
Lỗi xảy ra vào

68

Phiên bản Android 1.6 không nhận ra \ r \ n. Thay vào đó, hãy sử dụng: System.getProperty ("line.separator")

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

3
Upvote! Điều này làm việc cho tôi! Nếu bạn chỉ muốn thêm ngắt dòng ở dạng: textView.setText (string1 + System.getProperty ("line.separator") + string2); sau đó nó hoạt động một điều trị, cảm ơn bạn!
Hai lần được khoanh tròn

BÌNH THƯỜNG? Có phiên bản Android chạy Windows không?
maaartinus

3
Đối với bất kỳ ai sử dụng Xamarin, điều này là tương đương: Java.Lang.JavaSystem.LineSeparator ()
Steve

1
Tại sao không chỉ đơn giản là System.lineSpayator ()?
George Z.

60

Linebreaks (\ n) chỉ hoạt động nếu bạn đặt giá trị tài nguyên chuỗi của bạn trong dấu ngoặc kép như thế này:

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

Nó sẽ không thực hiện ngắt dòng nếu bạn đặt nó mà không có dấu ngoặc kép như thế này:

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

vâng, nó dễ dàng


3
tôi chỉ muốn thêm rằng công cụ trích dẫn này cũng hoạt động tốt với các ký tự đặc biệt trong tài nguyên chuỗi hoặc với các ngôn ngữ như tiếng Hy Lạp hoặc tiếng Nga ... (nếu bạn gặp bất kỳ vấn đề nào)
datayeah

1
Cảm ơn, tôi nghĩ rằng sử dụng dấu ngoặc kép là một giải pháp tốt hơn để duy trì khả năng đọc cho các văn bản nhiều dòng dài <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
xinthink

1
Sử dụng dấu ngoặc kép có các tác dụng phụ khác, chẳng hạn như làm cho các khoảng trắng luôn có ý nghĩa (không có dấu ngoặc kép, nhiều khoảng trắng trong một hàng, chẳng hạn như trong thụt lề, được thu gọn).
Pierre-Luc Paour

33

Đã thử tất cả các cách trên, đã thực hiện một số nghiên cứu của riêng tôi, kết quả là giải pháp sau đây để hiển thị ký tự thoát dòng nguồn:

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. Sử dụng phương thức thay thế, bạn cần lọc các nguồn cấp dữ liệu đã thoát (ví dụ: '\ n')

  2. Chỉ sau đó, mỗi phiên bản của ký tự thoát '\ n' được hiển thị vào nguồn cấp thực tế

Trong ví dụ này, tôi đã sử dụng cơ sở dữ liệu noQuery của Google Apps Scripting (ScriptDb) với dữ liệu được định dạng JSON.

Chúc mừng: D


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

18

Điều này làm việc cho tôi

android:text="First \n Second"

2
Ví dụ của bạn trông giống như nó bao gồm văn bản trong tài nguyên bố cục, đây là một thứ không lớn (không thể bản địa hóa).
Pierre-Luc Paour

17

Có hai cách xung quanh điều này. Nếu bạn sử dụng chuỗi của mình dưới dạng chuỗi thô, bạn cần sử dụng ký tự dòng mới. Nếu bạn sử dụng nó dưới dạng html, ví dụ bằng cách phân tích cú pháp với nó Html.fromString, biến thể thứ hai sẽ tốt hơn.

1) Nhân vật dòng mới \n

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

2) Thẻ dòng mới Html <br>hoặc<br />

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

6
Tôi đã không tải xuống nhưng tôi nghĩ rằng mã của bạn sai bạn cần "& lt; br>" thay vì "<br>" nó sẽ không hoạt động vì <là một biểu tượng dành riêng.
JPM

<br>, <u>, <b><i>thẻ được phép về tài nguyên chuỗi mà không thoát, và được áp dụng một cách chính xác bằng TextView.setText(resId). Chúng bị tước nếu sử dụng Context.getString(resId), trừ khi được bọc trong một CDATAphần.
Pierre-Luc Paour

16

Điều này làm việc cho tôi, có thể ai đó sẽ tìm ra điều này hữu ích:

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

11

Nếu bạn đang sử dụng XML để khai báo TextView sử dụng android:singleLine = "false"hoặc trong Java, hãy sử dụngtxtSubTitle.setSingleLine(false);


không, nó không hoạt động Nó có liên quan gì đến tài nguyên chuỗi và Html.fromHtml () không?
giọtOfJupiter

@dropsOfJupiter: bạn đã xem cuộc gọi Html.fromHtml () đang trả về chưa? Tôi tò mò gán nó cho Chuỗi và xem xét nó trong trình gỡ lỗi.
Slund

10

Android Studio đã sử dụng 0.8.9. Cách duy nhất làm việc cho tôi là sử dụng \n. Không gói với CDATA cũng không <br>hoặc <br />làm việc.



8

rất dễ dàng: sử dụng "\ n"

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

\ n tương ứng với ASCII char 0xA, là 'LF' hoặc nguồn cấp dữ liệu

\ r tương ứng với ASCII char 0xD, đó là 'CR' hoặc trả lại vận chuyển

điều này bắt nguồn từ những máy đánh chữ đầu tiên, nơi bạn có thể chọn chỉ thực hiện một nguồn cấp dữ liệu (và chỉ nhập một dòng thấp hơn), hoặc một nguồn cấp dữ liệu + trả lại vận chuyển (cũng di chuyển đến đầu dòng)

trên Android / java, \ n tương ứng với nguồn cấp dữ liệu + dòng trở lại, như bạn thường chỉ 'ghi đè' cùng một dòng


6

Cố gắng kiểm tra lại nội địa hóa của bạn. Có thể, bạn đang cố chỉnh sửa một tệp (bản địa hóa), nhưng thực sự chương trình sử dụng tệp khác, giống như trong trường hợp của tôi . Ngôn ngữ hệ thống mặc định là tiếng Nga, trong khi tôi cố gắng chỉnh sửa nội địa hóa tiếng Anh.

Trong trường hợp của tôi, giải pháp làm việc là sử dụng "\ n" làm dấu tách dòng:

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

4

Ngoài ra bạn có thể thêm "&lt;br&#47;&gt;" thay vì \ n.

Đó là mã HTML đã thoát cho <br/>

Và sau đó bạn có thể thêm văn bản vào TexView:

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

không, đừng nghĩ vậy Android thực sự sẽ in vô nghĩa đó. Tôi đã thử. Nó hoạt động tốt trong HTML nhưng không phải ở đây, đặc biệt là khi bạn đang thực hiện Html.fromHTML ("chuỗi của tôi từ tệp xml")
giọtOfJupiter

@drops - Đừng quênString ==> Html.fromHtml(textForTextView).toString()--- Và sau đó bạn có thể làm: articleTextView.setText(Html.fromHtml("text before break<br/>text after break").toString());-------- Nói cách khác, chỉ cần sử dụng <br/>trực tiếp bên trongfromHtml()
Peter Ajtai

&lt;br/>nên đủ để đảm bảo thông tin phong cách không bị tước bỏ. (dựa trên tài liệu chính thức)
jpmcosta

3

Bạn cũng có thể sử dụng Trình chỉnh sửa chuỗi của Android Studio, nó tự động tạo ra các đường phanh và những thứ tương tự ...


2

Html.fromHtmlkhông tán thành nên tôi chỉ đơn giản là tôi đã sử dụng mã này để lấy String2 trong dòng tiếp theo.

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

Cách dễ nhất để làm điều đó là đi đến các giá trị / chuỗi (trong thư mục tài nguyên của bạn)

Khai báo một chuỗi ở đó:

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

Và trong tệp xml cụ thể của bạn, chỉ cần gọi chuỗi như

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

1

Tôi tìm thấy một phương pháp khác: Cần thiết để thêm thuộc tính " android: maxWidth =" 40dp " ". Tất nhiên, nó có thể không hoạt động hoàn hảo, nhưng nó cho một ngắt dòng.


1

\ n đã không làm việc cho tôi. Tôi đã có thể khắc phục sự cố bằng cách thay đổi xml thành văn bản và xây dựng thuộc tính văn bản xem văn bản như bên dưới.

android:text="Line 1
Line 2
Line 3

DoubleSpace"

Hy vọng rằng Điều này sẽ giúp những người đã nói rằng họ không làm việc cho họ.


Tôi không tin đây là một giải pháp tốt. Có những \nnhân vật ẩn trong đó.
Almo

1

Tôi đang đọc văn bản của mình từ một tệp, vì vậy tôi đã thực hiện một cách tiếp cận hơi khác, vì việc thêm \ n vào tệp dẫn đến \ n xuất hiện trong văn bả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

Có lẽ bạn có thể đặt lf vào văn bản, nhưng nó không hiển thị? Hãy chắc chắn rằng bạn có đủ chiều cao cho điều khiển. Ví dụ:

Chính xác:

android:layout_height="wrap_content"

Có thể sai:

android:layout_height="10dp"

0

Trong trường hợp của tôi, tôi đã giải quyết vấn đề này bằng cách thêm vào như sau:

android:inputType="textMultiLine"

Kiểu đầu vào dành cho EditText chứ không phải TextView
clauziere

0

thử cái này:

         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

Sử dụng ngắt văn bản như thế này (\ n):

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

0

Tôi cảm thấy như một câu trả lời đầy đủ hơn là cần thiết để mô tả làm thế nào điều này hoạt động kỹ lưỡng hơn.

Đầu tiên, nếu bạn cần định dạng nâng cao, hãy kiểm tra hướng dẫn về cách sử dụng HTML trong tài nguyên chuỗi .
Sau đó, bạn có thể sử dụng <br/>, vv Tuy nhiên, điều này đòi hỏi phải thiết lập văn bản bằng mã.

Nếu đó chỉ là văn bản đơn giản, có nhiều cách để thoát một ký tự dòng mới (LF) trong tài nguyên chuỗi tĩnh .

Đóng chuỗi trong dấu ngoặc kép

Cách sạch nhất là đặt chuỗi trong dấu ngoặc kép.
Điều này sẽ làm cho nó để khoảng trắng được diễn giải chính xác như nó xuất hiện, không bị sụp đổ.
Sau đó, bạn có thể chỉ cần sử dụng dòng mới thông thường trong phương pháp này (không sử dụng thụt lề).

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

Lưu ý rằng một số ký tự yêu cầu thoát đặc biệt trong chế độ này (chẳng hạn như \").

Trình tự thoát bên dưới cũng hoạt động trong chế độ trích dẫn.

Khi sử dụng một dòng trong XML để biểu diễn các chuỗi nhiều dòng

Cách thanh lịch nhất để thoát dòng mới trong XML là với điểm mã của nó (10 hoặc 0xA ở dạng hex) bằng cách sử dụng thực thể XML / HTML của nó &#xA;hoặc &#10;. Đây là cách XML để thoát khỏi bất kỳ ký tự nào .
Tuy nhiên, điều này dường như chỉ hoạt động trong chế độ trích dẫn.

Một phương pháp khác là sử dụng đơn giản \n, mặc dù nó ảnh hưởng tiêu cực đến mức độ dễ đọc, theo ý kiến ​​của tôi (vì nó không phải là một chuỗi thoát đặc biệt trong XML, Android Studio không làm nổi bật nó).

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

Không bao gồm một dòng mới hoặc bất kỳ khoảng trắng nào sau bất kỳ chuỗi thoát nào, vì điều đó sẽ được hiểu là không gian thêm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.