Як обернути текст у текстовому режимі в 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

Відповіді:


55

Для мене ця проблема виникла лише на Android <4.0

Комбінацією параметрів, які я використовував, були:

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

Підрахунок maxLines здавався випадковим фінальним фрагментом, який зробив моє обгортання TextView.


9
Зараз я знаю, що це стара тема, але думав, що опублікую свої висновки. Я використав лише "android: maxLines", а потім він обгорнув мій текст. Вітати @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

У випадку, коли TextViewa знаходиться всередині 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" : текст не вирізаний на ширину текстового перегляду

  • android:scrollHorizontally="false" текст обгортається на стільки рядків, скільки потрібно


5
Це не працює для мене. (FWIW, у мене є TextView в TableRow в TableLayout.)
ац

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

Розрив текстового перегляду Стратегічне зображення


7

Це повинно вирішити вашу проблему: android:layout_weight="1".


Це просто призводить до того, що TextView розширюється, щоб зайняти якомога більше місця, це те саме, що встановити Height match_parent. Не зовсім те саме, що хотів ОП.
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"
    

Сподіваюся, це спрацює і для вас.


Спробував стільки речей, щоб це працювало в режимі "випадаючого меню", але нічого не вийшло. Тепер зупинився на режимі "діалог".
Мангеш

4

Встановлення android:maxEmsзаданого значення разом із android:layout_weight="1"призведе до того, що TextView обернеться, коли він досягне заданої довжини ems.


Працює і для TextView, розміщеного в RelativeLayout.
ayz4sci

шукали годинами, дякую, він чудово працює і на constraintLayout
TarekB

3

В Android Studio 2.2.3 під inputTypeвластивістю є властивість під назвою textMultiLine. Вибір цієї опції розібрав подібну проблему для мене. Я сподіваюся, що це допоможе.


2
Це для EditText, а не Textview
PsychedelicSubstance

2

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


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"

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. Мітка класу просто розширює TextView - не роблячи там нічого, крім встановлення розміру шрифту та кольору шрифту.

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


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