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

Мне понравилось ниже в 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, а я использую _4 _...

так в чем же ошибка, которую я здесь делаю?


person Chatar Veer Suthar    schedule 13.07.2011    source источник


Ответы (19)


Если текст, который вы вставляете в 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>
person Zarah    schedule 13.07.2011
comment
OP не хотел, чтобы TextView всегда имел четыре строки независимо от длины текста в нем. - person tar; 04.06.2014
comment
Этот ответ сработал для меня. Но я получил наилучшие результаты, но не с максимальными линиями и линиями, а с максимальными линиями и минимальными линиями и не использовал линии. Я установил minlines равным 1, а maxlines больше, чем самые большие данные. Таким образом я получаю от 1 до N строк для компактного просмотра данных. - person R Earle Harris; 15.11.2014
comment
@REarleHarris: Я тоже пробовал то же решение, но проблема в том, что он не принимает счет maxLines. Все данные отображаются в количестве minLines. Что я могу попробовать сейчас? Я использую пользовательское текстовое представление в xml - person Sagar Devanga; 22.08.2015

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

android:inputType="textMultiLine"

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

Однако android:singleLine="false" работал нормально.

person Ryan    schedule 27.01.2015
comment
Это не совсем правильно, поскольку собственные ошибки lint в Android предполагают, что вы используете этот атрибут только с EditText, а не с TextView. - person Jared; 14.03.2016
comment
Вы имеете в виду текст Multiline? Я сказал не использовать это. singleLine подходит для TextViews: developer.android.com/reference/ android / widget / - person Ryan; 15.03.2016
comment
android: singleLine устарел - person Humberto Castañeda; 21.12.2016
comment
Вы уверены? Он не упоминает, что в документах, на которые я ссылаюсь в приведенном выше комментарии, хотя я только что видел, что он отмечен как таковой в документах res. Странно, что они не упоминают об этом на странице TextView. Проблема в том, что предлагаемый ими обходной путь (многострочный) останавливает кликабельность представления, когда я вставляю свой OP. developer.android.com/reference/android/R.attr.html# singleLine - person Ryan; 22.12.2016
comment
android: singleLine = false устарел, поскольку это значение по умолчанию - person Ashraf Alshahawy; 21.09.2017
comment
@AshrafAlshahawy, это правильно, только если вы не укажете тип ввода в соответствии с документами. Это было некоторое время назад, когда я написал этот пост, но в тот момент мне определенно пришлось вручную настроить его, чтобы получить желаемое поведение (и, судя по тому факту, что это все еще поддерживается годами спустя, другие люди тоже). Странно, да. Возможно, я установил тип ввода, но это TextView, а не EditText, и я использовал его в меню, поэтому сомневаюсь в этом. - person Ryan; 10.10.2017
comment
Ребята Android фальшивки. Почему они не могут поставить эту функцию? - person henrybbosa; 27.10.2017

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

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

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

person Maragues    schedule 05.12.2013
comment
android: inputType = textMultiLine не для TextView, а для EditText, и вы получите предупреждение, если попытаетесь это сделать - person bhaskarc; 12.04.2014
comment
Вы должны прислушаться к предупреждениям. Используйте решение @Ryans. - person m02ph3u5; 11.03.2016

Просто вставьте '\ 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"/> 
person Naunidh Singh    schedule 08.08.2015
comment
это решение нельзя использовать для динамической установки текста - person Sagar Devanga; 22.08.2015
comment
@SagarDevanga Что означает динамическая установка текста? - person juil; 25.05.2016
comment
@SagarDevanga, я только что проверил, динамический и статический тексты по умолчанию многострочные (если используется \n), так что это правильное решение. Нет singleLine=false, нет lines=4 и так далее. - person CoolMind; 18.08.2016

Просто добавьте текстовое представление в 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>
person Pravin Bhosale    schedule 01.07.2014

Я научился добавлять "\ 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 между 17:00 и By позволил мне лучше контролировать, где я хочу, чтобы моя следующая строка начиналась и заканчивалась.

person Eduardo Lopez    schedule 17.02.2017

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

person Boris Strandjev    schedule 15.11.2012

Попробуйте работать с 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 -->
/>  

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

person Khalil Meg    schedule 26.03.2017

Сначала замените "\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()))

Это прекрасно работает.

person Gulzar Bhat    schedule 19.09.2017

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

android:inputType="textMultiLine"
person Bhuvan Bhatt    schedule 15.06.2017
comment
Разве android:inputType атрибут для <EditText> не для <TextView>? - person timtim; 06.09.2017
comment
Если вы добавите этот атрибут в TextView, появится предупреждение. - Атрибут android: inputType = textMultiLine не следует использовать с ‹TextView›. Фактически этот атрибут предназначен для EditText. - person Yhondri; 28.08.2019

вы можете использовать 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" />
person Enakhi    schedule 21.01.2019
comment
Это отображается как предупреждение. Не предназначен для использования в TextView - person Stealth Rabbi; 05.12.2019
comment
inputType поддерживает только компоненты EditText. - person Chamin Wickramarathna; 17.05.2020

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

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

у меня это сработало. 1 - номер столбца.

person Susana Mar Flores    schedule 10.09.2014

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

<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 там, где вы хотите вставить новую строку. Надеюсь, это поможет вам.

person dAv dEv    schedule 28.06.2020

Ключ - это Textview с singleline=false (который, да, устарел, но должен работать) в сочетании с lines, maxlinesor 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"/>
person Sneg    schedule 20.07.2020

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

<EditText
        android:id="@+id/notesInput"
        android:hint="Notes"
        android:inputType="textMultiLine"
/>
person Aathil Ahamed    schedule 20.10.2020

Код ниже может работать для однострочного и многострочного текстового просмотра.

isMultiLine = Если true, то Textview отображается в многострочном режиме, в противном случае - в одной строке.

    if (isMultiLine) {
        textView.setElegantTextHeight(true);
        textView.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
        textView.setSingleLine(false);
        
    } else {
        textView.setSingleLine(true);
        textView.setEllipsize(TextUtils.TruncateAt.END);
    }
person Pratik Dodiya    schedule 26.01.2021

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

person Tara Prasad Sharma    schedule 24.09.2016

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

Я поместил 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>

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

person saleh sereshki    schedule 23.01.2018
comment
Пожалуйста, не делай этого. - person humble_wolf; 07.05.2019

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

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

person Rasel    schedule 13.07.2011
comment
Что, если я хочу использовать fill_parent вместо фиксированной ширины? Мой контент будет вырезан, если я это сделаю ... - person happyhardik; 13.09.2012
comment
Я попробую android:singleLine="false" или android:inputType="textMultiLine" (как описано Мараджусом). Обратите внимание, что android:inputType="textMultiLine" имеет приоритет, когда присутствуют оба - person Romantic Electron; 23.05.2014
comment
Разделяя мнения других, кто комментировал, это совершенно неправильно, и я ошеломлен тем, почему это принятый ответ. - person Aleks G; 11.11.2015