Текст 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.