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?

dropsOfJupiter
źródło
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"
RonN
źródło
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

dropsOfJupiter
źródło
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");
Eric JOYÉ
źródło
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.

datayeah
źródło
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

Robert
źródło
text.replace ("\\ n", System.getProperty ("line.separator"))
Mussa
18

To zadziałało dla mnie

android:text="First \n Second"
Aniruddha
źródło
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>
poitroae
źródło
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");
Zeljko Ivanovic
źródło
11

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

dziwny kwark
źródło
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.

Maxim Berezovsky
źródło
8

Używam następujących:

YOUR_TEXTVIEW.setText("Got some text \n another line");
Carlo Matulessy
źródło
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

Ronny Webers
źródło
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>
Dr Failov
źródło
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));
mobiledev Alex
źródło
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 ...

Tim
źródło
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;
    }
Shylendra Madda
źródło
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" />
Fidan Gill
źródło
1

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

Mistrz
źródło
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.

Josh Greco
źródł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());
Rich Vogt
źródło
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"
Jarekczek
źródło
0

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

android:inputType="textMultiLine"
Elcio Cestari
źródło
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" );
Bahman Rashidi
źródło
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>
Ashnet
źródło
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.

geekley
źródło