Текст Android TextView не загортається


77

Хтось може мені сказати, що з текстом пішло не так? Текст довший за один рядок не переноситься на наступний рядок, а виходить за межі екрана.

Наступний код:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:padding="4dip">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:padding="4dip">

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:orientation="horizontal" 
            android:padding="4dip">
            <TextView 
                android:id="@+id/reviewItemEntityName"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:text="event/venue" 
                android:textColor="@color/maroon"
                android:singleLine="true" 
                android:ellipsize="end" 
                android:textSize="14sp"
                android:textStyle="bold" 
                android:layout_weight="1" />

            <ImageView 
                android:id="@+id/reviewItemStarRating"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_alignParentBottom="true"
                android:src="@drawable/title_1_star" />
        </LinearLayout>

        <TextView 
            android:id="@+id/reviewItemDescription"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:text="Description comes here" 
            android:textSize="12sp" 
            android:layout_weight="1"/>
    </LinearLayout>
</LinearLayout>

12
Примітка: вам потрібно мати xmlns:android="http://schemas.android.com/apk/res/android"лише кореневий елемент.
— Джеремі Логан,

У моєму випадку у мене був дуже великий TextView, що показував число, і як над цим, так і під ним залишалося значно велике місце. Я швидко зрозумів, що для цього простору потрібні інші персонажі. Здається, TextView резервує цей простір для символів нижче числа, наприклад "2g", де нижня частина "g" буде використовувати цей нижній пробіл.
— Бенджамін Басмачі,

Відповіді:


82

Я сам це виправив, ключ є android:width="0dip"

<LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="4dip"
    android:layout_weight="1">

    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="4dip">

        <TextView
            android:id="@+id/reviewItemEntityName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/maroon"
            android:singleLine="true"
            android:ellipsize="end"
            android:textSize="14sp"
            android:textStyle="bold"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/reviewItemStarRating"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentBottom="true" />
        </LinearLayout>

        <TextView
            android:id="@+id/reviewItemDescription"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            android:width="0dip" />

    </LinearLayout>

    <ImageView
        android:id="@+id/widget01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/arrow_nxt"
        android:layout_gravity="center_vertical"
        android:paddingRight="5dip" />

</LinearLayout> 


33
краще використовувати android:layout_weight=1замість нульової ширини, це означає, що textview заповнить решту вмісту
— shaman.sir

1
android: layout_weight = "1" не працює на моєму S3, але android: width = "0dip" працює? Це дивно. Будь-які пояснення?
— productioncoder

якщо ви використовуєте GridLayout, ви захочете використовувати columnWeight, і він доступний лише для версії 21 або новішої.
— Johnny Wu

Це чудово працює, якщо я хочу встановити кінець тексту в один рядок. Що робити, якщо я хочу встановити кінець тексту для більш ніж 1 рядка. У наведеному вище рішенні, якщо я встановив android: singleLine = "false", тоді рішення не працює
— tejraj

39

Єдина правильна відповідь на це питання є те , що вам потрібно встановити батьків до правильної ширині (в даному випадку FILL_PARENT, WRAP_CONTENT) і використовувати android:layout_weight=1для TextView , який повинен бути намотаний.

SingleLine увімкнено за замовчуванням, тому не буде вносити змін.

widthНабір для 0px буде працювати , але це не є хорошим рішенням.

Ось приклад (цього разу в табличному поданні), використовуючи xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">
    <TableLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:stretchColumns="*"
        android:id="@+id/tableLayout1">
        <TableRow android:id="@+id/tableRow1" android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <TextView android:text="test1" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:layout_weight="0" />
            <TextView android:layout_weight="1"
                android:text="test2 very long text that needs to be wrapped properly using layout_weight property and ignoring singleline since that is set by default..."
                android:layout_width="fill_parent" android:layout_height="wrap_content" />
        </TableRow>     
    </TableLayout>
</LinearLayout>

Якщо ви хочете встановити це в коді, ви шукаєте layout_weight як третій параметр, як у цьому прикладі, де йому встановлено значення 1:

row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));
TextView label = new TextView(getApplicationContext());
label.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT, 1f));

19

Ви повинні використовувати 2 параметри:

  • android:ellipsize="none" : текст не вирізаний на ширину текстового перегляду

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


1
Я виявив, що у моєму випадку мені довелося додати android: maxLines = "X" разом із цими двома. X - будь-яке число (більше 1, очевидно) Текст, який потім обгортається на Android 2.3
— Guykun,

13

Досить використовувати у вашому файлі xml.

android:singleLine="false".

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

Всього найкращого!


10

Я не міг отримати жодне з цих рішень, працюючи під час використання TableLayout>TableRow>TextView. Тоді я знайшов TableLayout.shrinkColumns="*". Єдиним іншим рішенням, яке спрацювало, було примушування TextView до layout_width:250pxі т.д., але мені не подобається примусовувати ширину так.

Спробуйте щось подібне, якщо працюєте з таблицями.

            <TableLayout 
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:shrinkColumns="*">

Зверніть увагу, що вам потрібно shrinkColumns="*"

Це очевидно в межах <LinearLayout>. Так щось на зразок<LinearLayout> <TableLayout> <TableRow> <TextView>

посилання:

Розкладка таблиці

http://code.google.com/p/android/issues/detail?id=4000

Надія, що комусь допомагає.


4

Один із параметрів макета неправильний у коді. У першому TextView

android:layout_width="wrap_content"

перейти

android:layout_width="fill_parent" 

Текст, який виходить за межі ширини екрану, перенесеться на наступний рядок і встановиться android:singleline="false".


8
Я думаю fill_parent, що застаріла та замінена на match_parent.
— RCB

3

Встановіть висоту подання тексту android:minHeight="some pixes"або android:width="some pixels". Це вирішить проблему.


3

У моєму випадку видалення типу введення зробило трюк, я використовував android: inputType = "textPostalAddress", оскільки мій текстовий перегляд був приклеєний до одного рядка і не обертався, видаленням цього було виправлено проблему.


1

Я новачок у Android (і графічному інтерфейсі), але маю великий досвід роботи з програмним забезпеченням. Я пройшов кілька навчальних посібників, і я розумію це:

layout_width і layout_height - це атрибути TextView. Вони містять інструкції щодо того, як TextView повинен формуватися, вони не стосуються того, як обробляти вміст у TextView.

Якщо ви використовуєте "fill_parent", ви говорите, що TextView повинен формуватися відносно батьківського подання, він повинен заповнювати його.

Якщо ви використовуєте "wrap_content", ви говорите, що слід ігнорувати батьківський подання і дозволити вмісту TextView визначати його форму.

Я думаю, що це заплутаний момент. "wrap_content" не говорить TextView, як керувати його вмістом (щоб обертати рядки), він говорить йому, що він повинен формуватися відносно свого вмісту. У цьому випадку, без нових символів рядка, він формується так, що весь текст знаходиться в одному рядку (який, на жаль, переповнює батьківський).

Я думаю, що ви хочете, щоб він заповнював батьківський елемент горизонтально, а вміст обертав вертикально.


1

Незважаючи на те, що це стара тема, я хотів би поділитися своїм досвідом, оскільки це мені допомогло. Моя програма працювала нормально для OS 2.0 та 4.0+, але для телефону HTC під управлінням ОС 3.x текст не обгортався. Мені вдалося включити обидва ці теги.

android:maxLines="100"
android:scrollHorizontally="false"

Якщо усунути будь-який, він не працював лише для пристрою os 3.0. Параметр "еліпсиз" мав нейтральний ефект. Ось повний тег текстового перегляду нижче

<TextView
                android:id="@+id/cell_description"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:paddingTop="5dp"
                android:maxLines="100"
                android:scrollHorizontally="false"
                android:textStyle="normal"
                android:textSize="11sp"
                android:textColor="@color/listcell_detail"/>

Сподіваюся, це комусь допоможе.


1

Збільшити висоту, тобто. android: height = "Деякий розмір", у мене це добре працює.


1

У мене була подібна проблема, коли мої два горизонтально зважених TextViews не обертали текст. Пізніше я дізнався, що проблема в тому, що батьки моїх батьків та батьків мали wrap_content замість match_parent.


0

Думаю, це залежить від конкретної комбінації макетів на дисплеї. Деякі прапори можуть бути замінені або проігноровані. У мене є TabHost з вкладками, кожна вкладка - це список таблиць. Отже, це вкладка ListView, кожен рядок є TableLayout TextView. Я спробував виправлення, перераховані вище, і жодне з них не спрацювало.


0

Я знаю, що це питання правильне, але в моєму випадку проблема полягала у встановленні властивості textSize у 'dp' - я змінив його на 'sp', і воно працює нормально.


0

У моєму випадку, за допомогою TableRow > ScrollView > TextViewвкладеності, я вирішив проблему, встановивши android:layout_widthзначення fill_parenton TableRow, та wrap_contenton on ScrollViewі TextView.


0

ви повинні використовувати android:singleLine="false"в TextViewмітках ur .


0

Нарешті мені вдалося додати кілька пікселів до висоти TextView, щоб вирішити цю проблему.

Спочатку вам потрібно фактично отримати висоту TextView. Це не просто, тому що воно дорівнює 0 до того, як його вже намалювали.

Додайте цей код до onCreate:

mReceiveInfoTextView = (TextView) findViewById(R.id.receive_info_txt);
if (mReceiveInfoTextView != null) { 
    final ViewTreeObserver observer = mReceiveInfoTextView.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int height = mReceiveInfoTextView.getHeight();
            int addHeight = getResources().getDimensionPixelSize(R.dimen.view_add_height);
            mReceiveInfoTextView.setHeight(height + addHeight);

            // Remove the listener if possible
            ViewTreeObserver viewTreeObserver = mReceiveInfoTextView.getViewTreeObserver();
            if (viewTreeObserver.isAlive()) {
                viewTreeObserver.removeOnGlobalLayoutListener(this);
            }
        }
    });
}

Вам потрібно додати цей рядок до dimens.xml

<dimen name="view_add_height">10dp</dimen>

Сподіваюся, це допоможе.


0

Я щойно видалив android:lines="1"і додав android:maxLines="2", що призвело до автоматичного загортання тексту. Проблемою був android:linesатрибут. Це призводить до того, що обтікання тексту не відбувається.

Мені не довелося використовувати maxEmsабо singleLine="false"(застарілий API), щоб це виправити.


0

Я витратив години, щоб зрозуміти, що в тексті, який я намагався відобразити, міститься одна лапка (у string.xml), тому я просто врятувався від неї зворотною рискою рискою, і вона приємно спрацювала => висота TextView правильно обертала текст :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-smallcaps"
        android:text="@string/instructions"
        android:textAlignment="center"
        android:textSize="18sp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/keyword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/defaultKeyword"
        android:textSize="22sp"
        />

0

В основному я використовую макет обмежень.

1) android:layout_width="match_parent"= намагається розтягнутися, щоб зустріти краї

2) android:layout_width="wrap_content"= базується виключно на введеному тексті без урахування інших поглядів поблизу. наприклад, додавання android:textAlignment="center"змінить форму тексту

3) android:padding="12dp" android:layout_width="0dp" android:layout_weight="1" android:singleLine="false"

= Текст складеться, щоб розмістити макети поблизу, не враховуючи сам текст


-1

Я ставлю цей атрибут:

android:inputType="textMultiLine"

в мій TextView, і в ньому є рядок для перенесення, і користувач може "Ввести" для нового рядка.

====================================================== ==========

Коли ви прийдете до цієї публікації, ви можете створити великий TextView, який може відображати кілька рядків, тому ці атрибути також можуть знадобитися

android:layout_height="Xdp" //where X is a number depends on how big Textview you want
android:gravity="top" //in order to make your text start from the top of your TextView.

7
Це для EditText, а не TextView.
— Джастін

-1

Раніше я android:ems="23"вирішував свою проблему. Просто замініть 23 найкращим значенням у вашому випадку.

<TextView
        android:id="@+id/msg"
        android:ems="23"
        android:text="ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab "
        android:textColor="@color/white"
        android:textStyle="bold"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

-1

Я додав \ n в середині рядка, і це виглядало нормально.


Це не у всіх ситуаціях. Розглянемо ситуації, коли текст може бути динамічним.
— the_new_mr

-5

Для обгортання тексту та розміщення тексту в наступному рядку ми повинні використовувати "\ n", тобто символ нового рядка у файлі xml макета, і перевірити зміну tht на емуляторі, а не на екрані макета.


3
Тобто перервати лінію лише в певній точці. Для обтікання на основі доступного розміру екрана (ширина перегляду) нам потрібно щось інше.
— hcpl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.