Як додати розрив рядка в 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 рядків, і він перетворює текст на наступний рядок, але якщо я хочу його розірвати, він не зламається.
dropOfJupiter

ви повинні опублікувати своє рішення як відповідь і прийняти його, щоб люди могли висловити позитив!
bigstones

1
Я створив невеликий зразок проекту, щоб проілюструвати різні способи кодування переломів лінії та їх побічні ефекти. Спойлер: \nце справді найкращий спосіб. github.com/paour/StringResourceTest
П'єр-Люк Паур

Чому за це питання так голосують? Ти це взагалі подивився? Рішення дуже просте, просто видаліть цю Html.fromHtml()функцію та просто використовуйте txtSubTitle.setText(getResources().getString(R.string.sample_string)).
Помилки трапляються

Відповіді:


222

\n працює для мене так:

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

87
Просто \nпоодинці буде працювати ... Не думай, що \rробить щось.
Пітер Айтай

5
\ r \ n це розрив рядків для Windows, і \ n - це розрив рядка для Linux
Guilherme Torres Castro

його не працює для мене <TextView android: layout_width = "50dp" android: layout_height = "70dp" android: layout_weight = "1" android: background = "@ dravable / keypad1" android: gravity = "center" android: text = " 2 ABC "/>
AndroidRaji

1
Оманливі помилки за те, що не згадували про іншу зміну, яку ви внесли, додаючи лапки навколо рядка
Патрік

2
'\ r' насправді в тексті відображається як 'r'. Отже, як запропонували інші, "\ n" робить трюк.
Михай Маркич

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(), що трохи відповідає простому рядку рядків і недостатньо підтримується постачальниками перекладів.
П’єр-Люк Паур

Давай людино, серйозно? Ви не могли знайти проблему в його питанні?
Помилки трапляються

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
Оновлення! Це працювало для мене! Якщо ви просто хочете додати розрив рядка у формі: textView.setText (string1 + System.getProperty ("line.separator") + string2); тоді це працює частування, дякую!
Двічі кружляв

ВАТ? Чи є версія Android під управлінням Windows?
maaartinus

3
Для всіх, хто використовує Xamarin, це еквівалент: Java.Lang.JavaSystem.LineSeparator ()
Стів,

1
Чому б не просто System.lineSeparator ()?
Джордж З.

60

Лінійні перерви (\ n) працюють лише в тому випадку, якщо ви ставите значення рядкового рядка в лапки таким чином:

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

Не буде робити рядкових рядків, якщо ви поставите їх без цитат:

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

так, це так просто.


3
Я просто хотів додати, що ця цитата також чудово працює із спеціальними символами в рядкових ресурсах або з такими мовами, як грецька чи російська ... (якщо у вас виникли проблеми)
datay yes

1
Дякую, я думаю, що використання лапок є кращим рішенням для збереження читабельності для довгих багаторядкових текстів <string name="sample_string">"some test line 1 some test line 2 line 3" </string>
xinthink

1
Використання лапок має й інші побічні ефекти, такі як зробити пробіли завжди значущими (без лапок, кілька пробілів підряд, наприклад, в відступах, згортаються).
П’єр-Люк Паур

33

Спробувавши все вищесказане, зробив кілька власних досліджень, в результаті чого було запропоновано наступне рішення для надання рятувальних знаків для виведення рядків:

string = string.replace("\\\n", System.getProperty("line.separator"));
  1. Використання методу заміни вам потрібно фільтр врятувався новий рядок (наприклад «\\ п»)

  2. Лише тоді кожен екземпляр рядка "\ n '" рядка "рядок" перетворюється у фактичне передачу рядків

Для цього прикладу я використав базу даних noSQL для сценаріїв Google Apps (ScriptDb) з форматом даних JSON.

Ура: D


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

18

Це працювало для мене

android:text="First \n Second"

2
Ваш приклад виглядає так, що він включає текст у ресурсі макета, що є великим «ні-ні» (неможливо локалізувати).
П’єр-Люк Паур

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розділ.
П’єр-Люк Паур

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 () та рядковими ресурсами?
крапліOffJupiter

@dropsOfJupiter: Ви подивилися на те, що повертається дзвінок Html.fromHtml ()? Мені було б цікаво призначити його для String і подивитися на це в налагоджувачі.
слунд

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 char 0xA, що є "LF" або каналом рядка

\ r відповідає ASCII char 0xD, що є "CR" або повернення каретки

це починається з перших друкарських машинок, де ви можете вибрати лише подачу рядка (і ввести лише рядок нижче) або подачу рядка + повернення каретки (що також переміщується до початку рядка)

в Android / java \ n відповідає каналу повернення перевезення + канал каналу, оскільки в іншому випадку ви просто 'перезапишете' той самий рядок


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

Ні, не думай так. 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-редактор Android Studio, він автоматично генерує лінійні гальма та подібні речі ...


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 на текст і побудувавши властивість тексту перегляду тексту, як показано нижче.

android:text="Line 1
Line 2
Line 3

DoubleSpace"

Сподіваємось, це допомагає тим, хто сказав, що \ n не працює на них.


Я не переконаний, що це хороше рішення. Там просто приховані \nсимволи.
Алмо

1

Я читаю текст з файлу, тому я трохи інший підхід, оскільки додавання \ n до файлу \ 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 not 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>

Зауважте, що деякі символи потребують спеціального переходу в цьому режимі (наприклад, \" ).

Послідовності подачі нижче також працюють у режимі цитування.

При використанні однорядного в 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.