Jak dodać podział wiersza w Android TextView?


157

Próbuję dodać podział wiersza w TextView.

Próbowałem zaproponować \ n, ale to nic nie daje. Oto jak ustawiam swoje teksty.

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

To jest mój ciąg: <string name="sample_string">some test line 1 \n some test line 2</string>

Powinien wyglądać tak:

some test line 1
some test line 2

Ale to pokazuje tak: some test line 1 some test line 2.

Czy coś mi brakuje?


czy ustawiłeś android: lines na co najmniej 2?
Robby Pond

moje napisy mają już do 6-9 wierszy i zawijają tekst do następnego wiersza, ale jeśli chcę go złamać, to się nie psuje.
dropsOfJupiter

powinieneś opublikować swoje rozwiązanie jako odpowiedź i zaakceptować je, aby ludzie mogli głosować za!
bigstones,

1
Stworzyłem mały przykładowy projekt, aby zilustrować różne sposoby kodowania podziałów wierszy i ich skutków ubocznych. Spoiler: \nto rzeczywiście najlepszy sposób. github.com/paour/StringResourceTest
Pierre-Luc Paour

Dlaczego głosowano na to pytanie? Czy w ogóle to sprawdziłeś? Rozwiązanie jest bardzo proste, wystarczy usunąć tę Html.fromHtml()funkcję i po prostu użyć txtSubTitle.setText(getResources().getString(R.string.sample_string)).
Błędy wydarzyły się

Odpowiedzi:


222

\n działa dla mnie tak:

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

87
Samo \nzadziała ... Nie myśl, że \rcoś robi.
Peter Ajtai,

5
\ r \ n to podział wiersza dla systemu Windows, a \ n to podział wiersza dla systemu Linux
Guilherme Torres Castro

to nie działa dla mnie <TextView android: layout_width = "50dp" android: layout_height = "70dp" android: layout_weight = "1" android: background = "@ drawable / keypad1" android: gravity = "center" android: text = " 2 ABC "/>
AndroidRaji

1
Mylące, że nie wspomniałeś o innej wprowadzonej przez ciebie zmianie, która polegała na dodaniu cudzysłowów wokół ciągu.
Patrick

2
„\ r” faktycznie wyświetla się jako „r” w tekście. Tak więc, jak sugerowali inni, „\ n” załatwia sprawę.
Miha Markic

92

ok, zrozumiałem:

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

więc zawijanie CDATA jest konieczne, a przerwy są dodawane w środku jako tagi html


3
Użyj tego w zasobie ciągów & # xa; Na przykład „Cześć! Pierwsza linia! & # Xa; To jest druga linia”
RexSplode

3
Wymaga to użycia Html.fromHtml(), co jest trochę za dużo dla prostego podziału wiersza i nie jest dobrze obsługiwane przez dostawców tłumaczeń.
Pierre-Luc Paour

No dalej stary, poważnie? Nie mogłeś znaleźć problemu w jego pytaniu?
Błędy wydarzyły się

68

Wersja 1.6 systemu Android nie rozpoznaje \ r \ n. Zamiast tego użyj: System.getProperty ("line.separator")

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

3
Głosuj za! To zadziałało dla mnie! Jeśli chcesz tylko dodać podział wiersza w postaci: textView.setText (ciąg1 + System.getProperty ("line.separator") + ciąg2); to działa wspaniale, dziękuję!
Dwukrotnie okrążył

WAT? Czy istnieje wersja systemu Android z systemem Windows?
maaartinus

3
Dla każdego, kto używa platformy Xamarin, jest to odpowiednik: Java.Lang.JavaSystem.LineSeparator ()
Steve

1
Dlaczego nie po prostu System.lineSeparator ()?
George Z.

60

Podziały wierszy (\ n) działają tylko wtedy, gdy umieścisz wartość zasobu ciągu w cudzysłowie, jak to:

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

Nie zrobi podziałów wierszy, jeśli umieścisz go bez cudzysłowów w ten sposób:

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

tak, to takie proste.


3
chciałem tylko dodać, że ten cytat działa również dobrze ze znakami specjalnymi w zasobach ciągów lub z językami takimi jak grecki czy rosyjski ... (jeśli napotkasz jakiekolwiek problemy)
datayeah

1
Dzięki, myślę, że używanie cudzysłowów jest lepszym rozwiązaniem, aby zachować czytelność długich tekstów <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
wielowierszowych

1
Używanie cudzysłowów ma inne skutki uboczne, takie jak umieszczanie spacji zawsze jako znaczące (bez cudzysłowów wiele spacji w wierszu, na przykład w wcięciach, jest zwiniętych).
Pierre-Luc Paour

33

Wypróbowałem wszystkie powyższe, przeprowadziłem własne badania, w wyniku których otrzymałem następujące rozwiązanie do renderowania znaków ucieczki z wysuwu linii:

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. Używanie zastąpić metodę trzeba filtr uciekł karetki (np „\\ n”)

  2. Dopiero wtedy każde wystąpienie znaku zmiany znaczenia '\ n' nowego wiersza jest renderowane do właściwego nowego wiersza

W tym przykładzie użyłem bazy danych Google Apps Scripting noSQL (ScriptDb) z danymi w formacie JSON.

Pozdrawiam: D


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

18

To zadziałało dla mnie

android:text="First \n Second"

2
Twój przykład wygląda tak, jakby zawierał tekst w zasobie układu, co jest wielkim nie-nie (niemożliwe do zlokalizowania).
Pierre-Luc Paour

17

Można to obejść na dwa sposoby. Jeśli używasz swojego ciągu jako nieprzetworzonego łańcucha, musisz użyć znaku nowego wiersza. Jeśli używasz go jako html, np. Parsując go z Html.fromString, drugi wariant jest lepszy.

1) Znak nowego wiersza \n

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

2) Tag HTML nowej linii <br>lub<br />

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

6
Nie głosowałem negatywnie, ale myślę, że Twój kod jest zły, potrzebujesz „& lt; br>” zamiast „<br>”, to nie zadziała, ponieważ <jest zastrzeżonym symbolem.
JPM

<br>, <u>, <b>I <i>tagi są dozwolone w zasobach ciąg bez ewakuacji i są właściwie stosowane przez TextView.setText(resId). Są zdejmowane, jeśli są używane Context.getString(resId), chyba że są owinięte w CDATAsekcję.
Pierre-Luc Paour,

16

U mnie to zadziałało, może ktoś okaże się pomocny:

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

11

Jeśli używasz XML do deklarowania użycia TextView android:singleLine = "false"lub w Javie, użyjtxtSubTitle.setSingleLine(false);


nie, to nie zadziałało. Czy ma to coś wspólnego z Html.fromHtml () i zasobami tekstowymi?
dropsOfJupiter

@dropsOfJupiter: czy spojrzałeś na to, co zwraca wywołanie Html.fromHtml ()? Byłbym ciekawy, jak przypisać go do String i przyjrzeć się temu w debugerze.
slund

10

Użyto Android Studio 0.8.9. Jedynym sposobem, który zadziałał dla mnie, jest używanie \n. Ani opakowanie z CDATA, ani <br>też nie <br />działały.



8

bardzo łatwe: użyj „\ n”

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

\ n odpowiada znakowi ASCII 0xA, czyli „LF” lub nowemu wierszowi

\ r odpowiada znakowi ASCII 0xD, co oznacza „CR” lub powrót karetki

pochodzi z pierwszych maszyn do pisania, gdzie można było wybrać tylko wysunięcie wiersza (i wpisanie tylko o wiersz niżej) lub przesunięcie wiersza + powrót karetki (co również przenosi się na początek wiersza)

w systemie Android / java \ n odpowiada znakowi powrotu karetki + przejściu do wiersza, tak jak w przeciwnym razie po prostu „nadpisałbyś” ten sam wiersz


6

Spróbuj dwukrotnie sprawdzić swoje lokalizacje. Możliwe, że próbujesz edytować jeden plik (lokalizację), ale w rzeczywistości programujesz używając innego, tak jak w moim przypadku . Domyślnym językiem systemu jest rosyjski, podczas gdy ja próbuję edytować angielską lokalizację.

W moim przypadku działającym rozwiązaniem jest użycie znaku „\ n” jako separatora linii:

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

4

Możesz także dodać "&lt;br&#47;&gt;"zamiast \ n.

Jest to kod ucieczki HTML dla <br/>

A potem możesz dodać tekst do TexView:

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

nea, nie myśl tak. Android faktycznie wydrukuje ten nonsens. Próbowałem. Działa dobrze w HTML, ale nie tutaj, zwłaszcza gdy robisz Html.fromHTML ("mój ciąg z pliku xml")
dropsOfJupiter

@drops - Nie zapomnij toString ==> Html.fromHtml(textForTextView).toString()--- A potem możesz zrobić: articleTextView.setText(Html.fromHtml("text before break<br/>text after break").toString());-------- Innymi słowy, po prostu użyj <br/>bezpośrednio w środkufromHtml()
Peter Ajtai

&lt;br/>powinno wystarczyć, aby upewnić się, że informacje o stylu nie zostaną usunięte. (na podstawie oficjalnej dokumentacji)
jpmcosta

3

Możesz także użyć edytora ciągów w Android Studio, automatycznie generuje przerwy w linii i tym podobne ...


2

Jako Html.fromHtmlprzestarzały, po prostu użyłem tego kodu, aby uzyskać String2 w następnej linii.

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

Najłatwiej to zrobić, przechodząc do wartości / ciągów znaków (w folderze zasobów)

Zadeklaruj tam ciąg:

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

A w swoim konkretnym pliku xml po prostu wywołaj ciąg w stylu

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

1

Znalazłem inną metodę: konieczne jest dodanie atrybutuandroid: maxWidth =„ 40dp ” ”. Oczywiście może nie działać idealnie, ale powoduje przerwanie linii.


1

\ n nie działa dla mnie. Udało mi się rozwiązać ten problem, zmieniając XML na tekst i budując właściwość textview, jak poniżej.

android:text="Line 1
Line 2
Line 3

DoubleSpace"

Miejmy nadzieję, że pomoże to tym, którzy powiedzieli, że \ n im się nie udało.


Nie jestem przekonany, że to dobre rozwiązanie. Są tam tylko ukryte \npostacie.
Almo

1

Czytam tekst z pliku, więc zastosowałem nieco inne podejście, ponieważ dodanie \ n do pliku spowodowało pojawienie się \ n w tekście.

    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

Może jesteś w stanie umieścić lf w tekście, ale się nie wyświetla? Upewnij się, że masz wystarczającą wysokość do sterowania. Na przykład:

Poprawny:

android:layout_height="wrap_content"

Może się mylić:

android:layout_height="10dp"

0

W moim przypadku rozwiązałem ten problem dodając:

android:inputType="textMultiLine"

Typ danych wejściowych jest przeznaczony dla EditText, a nie
TextView

0

Spróbuj tego:

         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

Użyj podziału tekstu w ten sposób (\ n):

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

0

Wydaje mi się, że potrzebna jest pełniejsza odpowiedź, aby dokładniej opisać, jak to działa.

Po pierwsze, jeśli potrzebujesz zaawansowanego formatowania, zapoznaj się z instrukcją, jak używać HTML w zasobach ciągów .
Następnie możesz użyć <br/>itp. Wymaga to jednak ustawienia tekstu za pomocą kodu.

Jeśli jest to zwykły tekst, istnieje wiele sposobów na uniknięcie znaku nowego wiersza (LF) w statycznych zasobach ciągu .

Ujęcie ciągu w podwójne cudzysłowy

Najczystszym sposobem jest umieszczenie ciągu w podwójnych cudzysłowach.
Dzięki temu białe znaki będą interpretowane dokładnie tak, jak się pojawiają, a nie zwinięte.
Następnie możesz po prostu normalnie użyć nowej linii w tej metodzie (nie używaj wcięć).

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

Zauważ, że niektóre znaki wymagają specjalnych znaków ucieczki w tym trybie (na przykład \").

Poniższe sekwencje specjalne działają również w trybie cytowanym.

Podczas używania jednowierszowego XML do reprezentowania ciągów wieloliniowych

Najbardziej eleganckim sposobem na uniknięcie znaku nowej linii w XML jest użycie jego punktu kodowego (10 lub 0xA w zapisie szesnastkowym) przy użyciu jednostki XML / HTML &#xA;lub &#10;. To jest sposób na ucieczkę dowolnego znaku w XML .
Jednak wydaje się, że działa to tylko w trybie cytowanym.

Inną metodą jest po prostu użycie \n, choć moim zdaniem negatywnie wpływa na czytelność (ponieważ nie jest to specjalna sekwencja ucieczki w XML, Android Studio jej nie wyróżnia).

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

Nie umieszczaj nowej linii ani spacji po żadnej z tych sekwencji ucieczki, ponieważ zostanie to zinterpretowane jako dodatkowa spacja.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.