Многострочный TextView в Android?


154

Я сделал как ниже xml

<TableRow>
    <TextView android:id="@+id/address1"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:gravity="left"
        android:maxLines="4" 
        android:singleLine="false"              
        android:text="Johar Mor, Gulistan-e-Johar, Karachi" >
    </TextView> 
</TableRow>

Это не работает multiline, и я использую TableLayout...

так что за ошибка я здесь делаю?

Ответы:


197

Если текст, который вы вводите, TextViewкороткий, он не будет автоматически расширяться до четырех строк. Если вы хотите, TextViewчтобы всегда было четыре строки независимо от длины текста, установите android:linesатрибут:

<TextView
    android:id="@+id/address1"
    android:gravity="left"
    android:layout_height="fill_parent"
    android:layout_width="wrap_content"
    android:maxLines="4"
    android:lines="4"
    android:text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."></TextView>

Вы можете сделать это с помощью TableRow, см. Ниже код

<TableRow >
        <TextView
            android:id="@+id/tv_description_heading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:padding="8dp"
            android:text="@string/rating_review"
            android:textColor="@color/black"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/tv_description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:maxLines="4"`enter code here`
            android:padding="8dp"
            android:text="The food test was very good."
            android:textColor="@color/black"
            android:textColorHint="@color/hint_text_color" />
    </TableRow>

21
ОП не «хотел, чтобы TextView всегда имел четыре строки независимо от длины текста в нем».
смола

7
Этот ответ работал для меня. Но я получил лучшие результаты не с максимальными линиями и линиями, а с максимальными и минимальными линиями и не использовал линии. Я установил minlines на 1, а maxlines больше, чем самые большие данные. Таким образом, я получаю от 1 до N строк для компактного представления данных.
R Эрл Харрис

1
@REarleHarris: я тоже попробовал то же самое решение, но проблема в том, что он не учитывает maxLines. Все данные отображаются в подсчете minLines. Что я могу попробовать сейчас, я использую пользовательский просмотр текста в XML
Сагар Деванга

119

Я просто подумал, что добавлю это, если вы используете:

android:inputType="textMultiLine"

Тогда представление перестает быть кликабельным. Я пытался получить многострочные текстовые просмотры в меню слайдера, которые, очевидно, должны реагировать на нажатия.

android:singleLine="false"Работал отлично , хотя.


3
Это не совсем правильно, поскольку собственные ошибки Android указывают на то, что вы используете этот атрибут только с EditText, а не с TextView.
Джаред

1
Вы имеете в виду текст Multiline? Я сказал не использовать это. SingleLine отлично подходит для TextViews: developer.android.com/reference/android/widget/…
Райан

3
Android: SingleLine устарела сейчас
Умберто Кастанеда

Ты уверен? Это не упоминает об этом в документах, на которые я ссылаюсь в приведенном выше комментарии, хотя я только что видел, что они отмечены как таковые в документах. Странно, они не упоминают об этом на странице TextView. Проблема в том, что предлагаемый ими обходной путь (многострочный) останавливает отображение кликабельности, когда я вставляю свой OP. developer.android.com/reference/android/R.attr.html#singleLine
Райан

3
android: singleLine = "false" устарела, поскольку это значение по умолчанию
Ашраф Альшахави

28

Мне не нравится ни один из ответов. Просто установите inputType и TextView адаптируется к его содержимому

<TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="textMultiLine"/>

Проверено на Nexus One (2.3) и Nexus 4 (4.4)


52
android: inputType = "textMultiLine" не для TextView, а для EditText, и если вы попытаетесь это сделать, вы получите предупреждение
bhaskarc

2
Вы должны слушать предупреждения. Используйте решение @Ryans.
m02ph3u5

15

Просто вставьте '\ n' внутри вашего текста ... никаких дополнительных атрибутов не требуется :)

          <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="Pigeon\nControl\nServices"
            android:id="@+id/textView5"
            android:layout_gravity="center"
            android:paddingLeft="12dp"/> 

6
это решение не может быть использовано для динамической установки текста
Сагар Деванга

@SagarDevanga Что означает динамический набор текста?
JUIL

3
@SagarDevanga, я только что проверил, динамический и статический тексты по умолчанию мультилинированы (если используются \n), так что это правильное решение. Нет singleLine=false, нет lines=4и так далее.
CoolMind

10

Просто добавьте текстовое представление в ScrollView

<ScrollView
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:layout_marginLeft="15dp"
           android:layout_marginRight="15dp"
           android:layout_marginTop="20dp"
           android:fillViewport="true">

           <TextView
               android:id="@+id/txtquestion"
               android:layout_width="fill_parent"
               android:layout_height="match_parent"
               android:background="@drawable/abs__dialog_full_holo_light"
               android:lines="20"
               android:scrollHorizontally="false"
               android:scrollbars="vertical"
               android:textSize="15sp" />

       </ScrollView>

5

Мне не нравится решение, которое заставляет количество строк в текстовом представлении. Я скорее предлагаю вам решить это с помощью предложенного здесь решения . Как я вижу, OP также борется с тем, чтобы текстовое представление выглядело как правильное в таблице, и shrinkColumnsявляется правильной директивой, которую нужно передать для достижения желаемого.


5

Попробуйте поработать с EditText, сделав его не щелкающим и не сфокусированным, также вы можете отобразить полосу прокрутки и удалить нижнюю панель EditText.
Вот пример:

<EditText
android:id="@+id/my_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_parent"
android:inputType="textMultiLine"                   <!-- multiline -->
android:clickable="false"                         <!-- unclickable -->
android:focusable="false"                         <!-- unfocusable -->
android:scrollbars="vertical"     <!-- enable scrolling vertically -->
android:background="@android:color/transparent"   <!-- hide the underbar of EditText -->
/>  

Надеюсь это поможет :)


3

Сначала замените "\n"его Htmlэквивалентом, "&lt;br&gt;" затем вызовите Html.fromHtml()строку. Выполните следующие шаги:

String text= model.getMessageBody().toString().replace("\n", "&lt;br&gt;")
textView.setText(Html.fromHtml(Html.fromHtml(text).toString()))

Это работает отлично.


2

То, что я узнал, было добавить «\ n» между словами, где вы хотите, чтобы он врезался в следующую строку. Например...

<TextView
    android:id="@+id/time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAlignment="center"
    android:text="M-F 9am-5pm \n By Appointment Only" />

\ N между 5 вечера и By позволил мне больше контролировать, где я хотел, чтобы моя следующая строка начиналась и заканчивалась.


2

Лучший ответ, который я нашел для многострочного TextView:

android:inputType="textMultiLine"

8
Не android:inputTypeявляется ли атрибут для <EditText>не для <TextView>?
Тимтим

Если вы добавите этот атрибут в TextView, появится предупреждение. - Атрибут android: inputType = "textMultiLine" не должен использоваться с <TextView>. На самом деле этот атрибут для EditText.
Йондри

2

Вы можете использовать Android: inputType = "textMultiLine"

  <TextView android:id="@+id/address1"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:gravity="left"
    android:maxLines="4" 
    android:inputType="textMultiLine"
    android:text="Johar Mor, Gulistan-e-Johar, Karachi" />

1
Это показано как предупреждение. Не предназначен для использования с TextView
Stealth Rabbi

1
inputType - это поддержка только компонентов EditText.
Chamin Wickramarathna

1

Я использовал:

TableLayout tablelayout = (TableLayout) view.findViewById(R.id.table);
tablelayout.setColumnShrinkable(1,true);

это сработало для меня. 1 номер колонки


0
You can do this with TableRow, see below code

<TableRow >
    <TextView
        android:id="@+id/tv_description_heading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:padding="8dp"
        android:text="@string/rating_review"
        android:textColor="@color/black"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tv_description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:maxLines="4"`enter code here`
        android:padding="8dp"
        android:text="The food test was very good."
        android:textColor="@color/black"
        android:textColorHint="@color/hint_text_color" />
</TableRow>

0

Самый простой способ

<TableRow>
    <TextView android:id="@+id/address1"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:gravity="left"
        android:maxLines="4" 
        android:singleLine="false"              
        android:text="Johar Mor,\n Gulistan-e-Johar,\n Karachi" >
    </TextView> 
</TableRow>

Используйте, \nгде вы хотите вставить новую строку, надеюсь, это поможет вам


0

Ключ к TextView с singleline=false(что да является устаревшим, но должны быть на работу) в сочетании с lines, maxlinesилиminlines

<TextView
                android:id="@+id/txtBowlers"
                style="@style/Default_TextBox.Small"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="4dp"
                android:singleLine="false"
                android:maxLines="6"
                android:text="Bob\nSally\nJohn"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="@+id/txtTeamName"
                app:layout_constraintTop_toBottomOf="@+id/txtTeamName"/>

-1

Почему бы вам не объявить строку вместо записи длинных строк в файл макета. Для этого вы должны объявить строку кода в файле макета 'android: text = "@ string / text"' и перейти к \\ app \ src \ main \ res \ values ​​\ strings.xml и добавить строку кода 'Ваш многострочный текст здесь' Также используйте '\ n', чтобы разорвать линию от любой точки, иначе линия будет автоматически скорректирована.


-4

у меня ни одно из решений не сработало. Я знаю, что это не полный ответ на этот вопрос, но иногда это может помочь.

Я поместил 4 просмотра текста в вертикальное линейное расположение.

<Linearlayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation:"vertical"

    ...>
    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text:"line1"
       .../>
    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text:"line2"
       .../>
    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text:"line3"
       .../>
    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text:"line4"
       .../>
</LinearLayout>

Это решение подходит для случаев, когда текстовое представление текста является постоянным, например, метки.


1
Пожалуйста, не делай этого.
humble_wolf

-23

TextView будет многострочным, если ему не хватит места, чтобы поместиться в одну строку, а singLine не будет установлен в true.

Если он получает пробел в одну строку, он не будет многострочным.


7
Что если я захочу использовать fill_parent вместо фиксированной ширины? Мой контент обрезается, если я это сделаю ...
happyhardik

6
Я постараюсь android:singleLine="false"или android:inputType="textMultiLine"(как описано Marageus). Замечание, которое android:inputType="textMultiLine"имеет приоритет, когда оба присутствуют
Романтический Электрон

Делясь мнением других, кто прокомментировал, это совершенно неправильно, и я удивляюсь, почему это принятый ответ.
Алекс Г
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.