Как перенести текст в текстовое представление в Android

86

Кто-нибудь знает, как обернуть текст в TextView на платформе Android. т.е. если текст в текстовом окне превышает длину экрана, он должен отображаться во второй строке.

Я искал и пробовал следующее:

android:scrollHorizontally="false",
android:inputType="textMultiLine",
android:singleLine="false"

Но никто не работает ..

Может ли кто-нибудь подсказать, как я могу это сделать.

Самир
источник
7
TextViews по умолчанию должен переносить слова. Вы можете опубликовать свой макет целиком?
danh32
Может быть, Textview находится внутри макета таблицы? Если да, у меня есть ответ.
JohnFx
1
В моем случае, после добавления около полудюжины атрибутов (описанных ниже), чтобы заставить текстовое представление переносить текст на несколько строк, я безуспешно заметил, что у меня есть атрибут android:inputType="textPersonName". Судя по всему, это было добавлено дизайнерским инструментом Android Studio. Удаление этого атрибута устранило проблему! Могут быть и другие типы ввода, предотвращающие перенос.
LarsH

Ответы:

56

Для меня эта проблема возникла только на Android <4.0

Я использовал следующие параметры:

android:layout_weight="1"
android:ellipsize="none"
android:maxLines="100"
android:scrollHorizontally="false"

Счетчик maxLines, казалось, был последней случайной частью, которая заставила меня обернуть TextView.

Гуйкун
источник
9
Я знаю, что это старая ветка, но думал, что опубликую свои выводы. Я использовал только «android: maxLines», а затем обернул мой текст. Cheer @Guykun
StuStirling
Опять же, это равносильно простой установке высоты TextView равной match_parent, что не то же самое, что увеличение высоты TextView с включением дополнительных строк.
SMBiggs
50

Макет ограничения

<TextView
android:id="@+id/some_textview"
android:layout_width="0dp"
android:layout_height="wrap_content"

app:layout_constraintLeft_toLeftOf="@id/textview_above"
app:layout_constraintRight_toLeftOf="@id/button_to_right"/>
  • Убедитесь, что ширина вашего макета равна нулю
  • левые / правые ограничения определены
  • высота макета wrap_content позволяет расширяться вверх / вниз.
  • Установите android:maxLines="2"для предотвращения вертикального расширения (2 - это просто пример)
  • Эллипсы вероятны. хорошая идея с максимальными строкамиandroid:ellipsize="end"

Ширина 0dp позволяет ограничениям влево / вправо определять ширину вашего виджета.

Установка ограничений влево / вправо устанавливает фактическую ширину вашего виджета, внутри которой будет переноситься ваш текст.

Документы по макету ограничений

Бейкер
источник
Да! Вот как это работает! Просто убедитесь, что вы установили ширину на 0dp
Йорако Гонсалес
установка левого и правого ограничений помогла мне обернуть его вместо текста, выходящего за правые границы
Цзя Цзе
31

Для случая, когда TextViewнаходится внутри a TableLayout, решение - установить android:shrinkColumns="1"на TableLayout. (Замените 1номером столбца, в котором находится TextView, который вы хотите обернуть. (0-индексированный))

AFAICT, никаких других атрибутов для TextView.

Для других случаев см. Другие ответы здесь.

FWIW, я изначально получил его для работы с

 <TextView
   android:id="@+id/inventory_text"
   android:layout_width="fill_parent"
   android:layout_weight="1"
   android:width="0dp"

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

айдж
источник
Это было то, что я искал! В противном случае мои слова будут отрезаны
Карсон Хольцхаймер
12

Вы должны использовать 2 параметра:

  • android:ellipsize="none" : текст не обрезается по ширине textview

  • android:scrollHorizontally="false" текст переносится на столько строк, сколько необходимо

Картагес
источник
5
У меня это не работает. (FWIW, у меня есть TextView в TableRow в TableLayout.)
aij
8

Используйте app:breakStrategy="simple"в AppCompatTextView, он будет контролировать макет абзаца.

Имеет три постоянных значения

  • сбалансированный
  • высокого качества
  • просто

Проектирование в вашем TextView xml

<android.support.v7.widget.AppCompatTextView
        android:id="@+id/textquestion"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:scrollHorizontally="false"
        android:text="Your Question Display Hear....Your Question Display Hear....Your Question Display Hear....Your Question Display Hear...."
        android:textColor="@android:color/black"
        android:textSize="20sp"
        android:textStyle="bold"
        app:breakStrategy="simple" />

Если ваш текущий минимальный уровень API составляет 23 или выше, тогда в кодировании

yourtextview.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);

Для получения дополнительной информации обратитесь к этой стратегии BreakStrategy

Textview breakСтратегическое изображение

Нирав Бхавсар
источник
7

Это должно решить вашу проблему: android:layout_weight="1".

user755121
источник
Это просто приводит к тому, что TextView расширяется, чтобы занять как можно больше места, что аналогично установке для параметра Height значения match_parent. Не совсем то, что хотел OP.
SMBiggs
1
В случае TableLayout layout_weight="1"проблема исправлена ​​для меня. Однако моя TableRow, содержащая TextView, имеет layout_heightопределенное значение. Может быть, кому-то будет полезно
комплект
5

Хорошо, ребята, правда где-то посередине, потому что вы должны видеть проблему с точки зрения родителей и ребенка. Приведенное ниже решение работает ТОЛЬКО при режиме счетчика = dialogнезависимо от версии Android (проблем нет .. протестировал его в VD и DesireS с Android => 2.2):

  1. . Установите режим спиннера (родительский), например:

    android:spinnerMode="dialog"  
    
  2. Задайте для свойств текстового представления (дочернего настраиваемого представления) следующие значения:

    android:layout_weight="1"  
    android:ellipsize="none"  
    android:maxLines="100"  
    android:scrollHorizontally="false"
    

Надеюсь, это сработает и для вас.

Skourkos
источник
Пробовал так много вещей, чтобы заставить его работать в «выпадающем» режиме, но ничего не помогло. Теперь остановились на «диалоговом» режиме.
Mangesh
4

Установка android:maxEmsданного значения вместе с android:layout_weight="1"приведет к переносу TextView по достижении заданной длины em.

Фреддроид
источник
Работает и для TextView, размещенного в RelativeLayout.
ayz4sci
искали часами, спасибо, он отлично работает и с constraintLayout
TarekB
3

В Android Studio 2.2.3 под inputTypeсвойством есть свойство с именем textMultiLine. Выбор этой опции помог мне решить аналогичную проблему. Надеюсь, это поможет.

user7652193
источник
2
Это для EditText, а не Textview
PsychedelicSubstance
2

Просто работал над TextView внутри макета внутри RecyclerView. Я текст получения отрезан, напр, для Read this message, я увидел: Read this. Я попытался установить android:maxLines="2"TextView, но ничего не изменилось. Однако android:lines="2"закончились Read thisна первой строчке и messageна второй.

Стэн Курдзил
источник
1

У меня такая же проблема. Следующее изменение заставило его работать -

android:layout_width="wrap_content"

Многоточие, maxLines или layout_weight - не имело никакого значения. Примечание. Ширина родительского элемента также устанавливается как wrap_content.

Медха
источник
1

Все, что вам нужно сделать, это установить ширину текстового поля .

android: layout_width = "60dp"

вы можете изменить ширину по своему усмотрению. Просто введите длинное предложение, чтобы проверить, работает ли оно так

android: text = "я хочу быть одним из инженеров-программистов мирового уровня"

Акиндев
источник
1

Попробуйте подход @ Guykun

android:layout_weight="1" android:ellipsize="none" android:maxLines="100" android:scrollHorizontally="false"

Также убедитесь, что ширина родительского элемента не установлена ​​для обтекания содержимого. Это то, чего мне не хватало.

Шайлендра Суриял
источник
0

Я использую Android 2.2, и мое текстовое представление автоматически перейдет к следующей строке, если оно выходит за пределы экрана.

Если вы хотите, чтобы текст переходил на следующую строку до конца экрана, просто добавьте (просто введите свое собственное значение dp). Это будет полезно, если у вас есть изображение справа от текста.

android:layout_marginRight="52dp"
Britc
источник
0

Как ни странно - я создал свой TextView в коде, и он обернулся - несмотря на то, что я не устанавливал ничего, кроме стандартных вещей, - но убедитесь сами:

LinearLayout.LayoutParams childParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);
childParams.setMargins(5, 5, 5, 5);

Label label = new Label(this);
label.setText("This is a testing label This is a testing label This is a testing label This is a testing labelThis is a testing label This is a testing label");
label.setLayoutParams(childParams);

Как видно из определения параметров, я использую LinearLayout. Класс Label просто расширяет TextView - ничего там не делает, кроме установки размера и цвета шрифта.

При запуске в эмуляторе (уровень API 9) текст автоматически переносится на 3 строки.

Ready4Android
источник
Обратите внимание на использование этого кода LinearLayout.LayoutParams childParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);. Скорее всего, это делает упаковку, которую вы считаете «автомагической»
nemesisfixx
0

Просто установите layout_withопределенный размер, когда текст заполнит максимальную ширину, он будет перетекать на следующую строку, вызывая эффект переноса.

<TextView
    android:id="@+id/segmentText"
    android:layout_marginTop="10dp"
    android:layout_below="@+id/segmentHeader"
    android:text="You have the option to record in one go or segments(if you swap options 
    you will loose your current recordings)"
    android:layout_width="300dp"
    android:layout_height="wrap_content"/>
Фрэнк Одум
источник
0

Уловка заключается в ширине textView, попробуйте сделать ее выделенным числом, например:

<TextView
    android:layout_width="300dp"
    android:layout_height="wrap_content"/>

Пробовал много решений безрезультатно, пробовал:

    android:ellipsize="none"
    android:scrollHorizontally="false"

единственное, что вызвало опцию обтекания, - это выделенная ширина

Ахмед Халид Кадхим
источник
-1

Вам нужно добавить свой TextView в ScrollView примерно так:

<ScrollView android:id="@+id/SCROLL_VIEW"  
android:layout_height="150px"   
android:layout_width="fill_parent">  

<TextView   
   android:id="@+id/TEXT_VIEW"   
   android:layout_height="wrap_content"   
   android:layout_width="wrap_content"   
   android:text="This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header" />  
 </ScrollView>
Людовик Ландри
источник
4
Спасибо за ответ. Но моя цель - обернуть текст, когда он превышает длину строки, чтобы не поставить горизонтальный скроллер.
Самир