Android: останній рядок перегляду тексту відрізаний


113

У мене горизонталь, LinearLayoutщо містить TextViewнаступну Spinnerпоруч. Це LinearLayoutдинамічно завищене кілька разів у нерухомій вертикалі, що LinearLayoutміститься в межах RelativeLayout.

Проблема полягає в тому, що, оскільки я перейшов Theme.lightна Theme.holo.light, останній рядок TextViewотримує розрізаний навпіл. Це відбувається, коли динамічний текст довгий і охоплює більше одного рядка.

введіть тут опис зображення

Мені вдалося виправити це, додавши нижню підкладку до горизонталі, LinearLayoutщо містить TextViewі Spinner.

Це не є виправданням, а більше хаком. Може хтось, будь ласка, дасть мені поради, як правильно це виправити?

Я також прочитав деякі інші запитання, але жодне, здається, не допоможе.

Горизонтальний лінійний макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:layout_marginRight="20dp"
        android:text="TextView"/>

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

Відносний макет, де вище макет динамічно завищений на лінійному макеті з id ll2_7:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/relLayoutButtonNext"
        android:layout_below="@id/textView1" >

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="20dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:paddingTop="10dp" >

            <TextView
                android:id="@+id/textView10"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingRight="30dp"
                android:text="2.7" />

            <TextView
                android:id="@+id/textView11"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:layout_toRightOf="@id/textView10"
                android:text="@string/question2_7" />


            <LinearLayout
                android:id="@+id/ll2_7"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@+id/textView11"
                android:layout_below="@+id/textView11"
                android:orientation="vertical" android:layout_marginBottom="20dp">
            </LinearLayout>

        </RelativeLayout>

    </ScrollView>

</RelativeLayout>

EDIT: Ось повний макет xml для вище:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        style="@style/question_section_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="@string/question2_header" />

    <RelativeLayout
        android:id="@+id/relLayoutButtonNext"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@color/bottomBar"
        android:paddingBottom="3dp"
        android:paddingLeft="50dp"
        android:paddingRight="50dp"
        android:paddingTop="3dp" >

        <Button
            android:id="@+id/buttonNext"
            android:layout_width="180dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:onClick="nextStep"
            android:text="Next Section"
            android:textSize="20sp" />

        <Button
            android:id="@+id/buttonPrevious"
            android:layout_width="180dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:onClick="previousStep"
            android:text="Previous Section"
            android:textSize="20sp" />
    </RelativeLayout>


    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/relLayoutButtonNext"
        android:layout_below="@id/textView1" >



        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="20dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:paddingTop="10dp" >

            <TextView
                android:id="@+id/textView10"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingRight="30dp"
                android:text="2.7" />

            <TextView
                android:id="@+id/textView11"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:layout_toRightOf="@id/textView10"
                android:text="@string/question2_7" />


            <LinearLayout
                android:id="@+id/ll2_7"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@+id/textView11"
                android:layout_below="@+id/textView11"
                android:orientation="vertical" android:layout_marginBottom="20dp">

            </LinearLayout>

            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@+id/textView10"
                android:layout_below="@+id/ll2_7"
                android:text="2.8" />

            <TextView
                android:id="@+id/textView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/ll2_7"
                android:layout_toRightOf="@+id/textView10"
                android:text="@string/question2_8" android:layout_marginBottom="10dp"/>


            <LinearLayout
                android:id="@+id/ll2_8"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@+id/textView3"
                android:layout_below="@+id/textView3"
                android:layout_marginBottom="20dp"
                android:orientation="vertical" >

            </LinearLayout>

            <TextView
                android:id="@+id/textView4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@+id/textView2"
                android:layout_below="@+id/ll2_8"
                android:text="2.9" />

            <TextView
                android:id="@+id/textView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/ll2_8"
                android:layout_toRightOf="@+id/textView10"
                android:text="@string/question2_9" android:layout_marginBottom="10dp"/>


            <LinearLayout
                android:id="@+id/ll2_9"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/textView5"
                android:layout_toRightOf="@+id/textView10"
                android:orientation="vertical" android:layout_marginBottom="20dp">

            </LinearLayout>

            <TextView
                android:id="@+id/textView6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@+id/textView4"
                android:layout_below="@+id/ll2_9"
                android:text="2.10" />

            <TextView
                android:id="@+id/textView7"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/ll2_9"
                android:layout_toRightOf="@+id/textView10"
                android:text="@string/question2_10" android:layout_marginBottom="10dp"/>


            <LinearLayout
                android:id="@+id/ll2_10"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/textView7"
                android:layout_marginBottom="20dp"
                android:layout_toRightOf="@+id/textView10"
                android:orientation="vertical" >

            </LinearLayout>

            <TextView
                android:id="@+id/textView8"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@+id/textView6"
                android:layout_below="@+id/ll2_10"
                android:text="2.11" />

            <TextView
                android:id="@+id/textView9"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/ll2_10"
                android:layout_toRightOf="@+id/textView10"
                android:text="@string/quesiton2_11" android:layout_marginBottom="10dp"/>


            <LinearLayout
                android:id="@+id/ll2_11"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@+id/textView9"
                android:layout_below="@+id/textView9"
                android:orientation="vertical" android:layout_marginBottom="20dp">

            </LinearLayout>

            <TextView
                android:id="@+id/textView12"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@+id/textView8"
                android:layout_below="@+id/ll2_11"
                android:text="2.11.1" />

            <TextView
                android:id="@+id/textView13"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/ll2_11"
                android:layout_toRightOf="@+id/textView10"
                android:text="@string/question2_11_1" android:layout_marginBottom="10dp"/>


            <LinearLayout
                android:id="@+id/ll2_11_1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/textView13"
                android:layout_toRightOf="@+id/textView10"
                android:orientation="vertical" android:layout_marginBottom="20dp">

            </LinearLayout>

        </RelativeLayout>

    </ScrollView>

</RelativeLayout>

спробуйте видалити android: paddingBottom = "20dp"
Dheeresh Singh

2
Спробуйте набивання текстового перегляду та лінійні поля макета також можуть приємно подати руку
Aashish Bhatnagar

LinearLayout дуже проблематичний при горизонтальному використанні. Замість цього використовуйте ConstraintLayout. Побачити. stackoverflow.com/a/48677954/630668
Дхармендра

Відповіді:


55

Я зіткнувся з тією ж проблемою із відключенням, як показано на скріншоті. Він обумовлений вирівнюванням базової лінії по горизонталі LinearLayout. TextViewі Spinnerмають різні базові лінії через різницю у розмірі шрифту. Для усунення проблеми потрібно вимкнути вирівнювання базової лінії для макета, встановивши:

android:baselineAligned="false"

або в коді:

layout.setBaselineAligned(false);

2
Я б хотів, щоб я міг проголосувати за це 100 разів! Я витрачав sooooo багато часу на це питання з цього питання, і ваша відповідь була моїм рішенням! Я не усвідомлював, що відбувається так довго, тому що настільки важко налагодити ієрархію перегляду на Android. Дуже дякую!!!
mbm29414

Це було вирішенням мого питання, окрім відповіді Рінардта. Дякую!
Джеймс Добсон

1
Це правильна відповідь, і вона вказує на причину, чому сталася помилка. Дякую.
Hoang Nguyen Huu

Це величезна порада для подібних ситуацій. Зовсім непогано. Дякую!
sunlover3

260

Спробувавши мільйон різних речей, я думаю, що у мене є відповідь.

Я застосував a LayoutGravityдо елемента TextView:

android:layout_gravity="fill"

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


12
досконалий, tnx, +1; зауважте, що багато значень layout_gravity допомагають, наприклад, center_vertical
Grzegorz Dev

2
Якщо це не працює, додавання значення прокладки "1sp" повинно працювати. Я створюю стиль, що розширюється, @android:style/Widget.TextViewі додаю наступні рядки:<item name="android:gravity">fill</item> <item name="android:padding">1sp</item>
Graeme

чому ця проблема трапляється просто з арабським текстом ?!
Менна-Аллах Самі

12
Це просто рішення. Правильне рішення - додати android:baselineAligned="false"до свогоLinearLayout
tomrozb

1
Хоча це, здається, працює, правильне рішення - це відповідь із коментаря tomrozb вище, або відповідь Джусида
Едуард Б.

28

У мене була така ж проблема, і я виявив, що просто додаю

android:includeFontPadding="false"

остаточний рядок тексту вже не мав відрізаних спадних рядків.


1
За допомогою спеціальних шрифтів це може бути ідеальним виправленням. Це єдине рішення, яке працювало для мене при використанні Droid Sans Japanese.
computingfreak

11

Після тексту додав пробіл після тексту

textView.setText(firstString+"\n");

Я спробував усі інші рішення. Але це було єдине рішення, яке працювало для мене


це те, що ви називаєте "чепі"
Zulqurnain Jutt

6

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <FrameLayout
        android:layout_width="150dp"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/textView1"
            android:layout_width="150dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="20dp"
            android:text="TextView"/>
    </FrameLayout>
    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

1
У мене було те CheckBoxсаме LinearLayout. Це вирішило питання.
Чінтан Шах

Працював як шарм із ситуацією CheckBox, як @ChintanShah
ignacardel

5

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

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

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

Переконайтеся, що ви використовуєте додатки та дії, як-от так:

<style name="Custom" parent="@android:style/Theme.Light">   
    <item name="android:textViewStyle">@style/Custom.Widget.TextView</item>
</style>

<style name="Custom.Widget.TextView" parent="@android:style/Widget.TextView"> 
    <item name="android:gravity">fill</item>
    <item name="android:padding">1sp</item>
</style>

Відповідь @Rynadt дуже допомогла дійти до вищевказаної стадії. Встановлення сили тяжкості тексту всередині перегляду забезпечує на деяких пристроях, що оклюзія ніколи не відбувається (текст правильно розміщений всередині виду), на інших - рука, що допомагає, із забиванням значення sp, забезпечує облік хвостів та ін. із конкретним значенням TextSize.


5

Моє рішення було близьким до прийнятого, але мені довелося його змінити

   android:layout_gravity="fill_vertical"

замість цього. В іншому випадку інші рядки були б розтягнуті, а також з доданими розривами рядків у випадкових місцях. Наприклад, найбільший рядок мав 4 рядки, тому інший рядок було змінено на

this is a testphrase

до

thi
s is
a testph
rase

1
Працює для мене. Дякую! +1
Ахмед

5

Я знайшов інше рішення, розширивши TextView і додавши спеціальний клас на зразок цього:

 public class AdaptingTextView extends TextView {

    public AdaptingTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public AdaptingTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AdaptingTextView(Context context) {
        super(context);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        // set fitting lines to prevent cut text
        int fittingLines = h / this.getLineHeight();
        if (fittingLines > 0) {
            this.setLines(fittingLines);
        }
    }

}

Відмінно працює, але будьте обережні, якщо у перегляді тексту вказано layout_margin, оскільки це може змінити кількість рядків, що підходять, щоб бути коротшими, ніж має бути! Я перейшов на використання прокладки замість поля та виправлену проблему
MobileMon

1
Це працює абсолютно ідеально. На сьогодні найкраще рішення, яке я знайшов.
Moonbloom

1
Це правильна відповідь, дякую! Щоб зробити його трохи приємніше і додати "..." до кінця тексту, перш ніж він буде усічений, додайте this.setEllipsize(TextUtils.TruncateAt.END);в оператор if вище та вийміть android:ellipsize="end"з XML, який з певних причин порушує його.
NeilS

4

спробуйте видалити android: paddingBottom = "20dp"

з

 <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="20dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:paddingTop="10dp" >

1
Прокладка там насправді не пов'язана, оскільки є додаткові елементи, що містяться в цьому відносному макеті, з прокладкою. Я видалив їх для легшого читання цієї публікації. Дивіться питання щодо редагування.
Рінардт

4

getViewTreeObserver().addOnGlobalLayoutListenerне працює в режимі переробки утилізатора. Якщо ви використовуєте переробник, використовуйтеView.addOnLayoutChangeListener :

Я виявив, що еліпсизація, яку я визначив textViewу xml, не завжди відображалася, тому я програматично встановила її перед переназначенням властивості тексту. Це працювало для мене.

textView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
    @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom,
                                   int oldLeft, int oldTop, int oldRight, int oldBottom) {
            textView.removeOnLayoutChangeListener(this);
            float lineHeight = textView.getLineHeight();
            int maxLines = (int) (textView.getHeight() / lineHeight);
            if (textView.getLineCount() != maxLines) {
                textView.setLines(maxLines);
                textView.setEllipsize(TextUtils.TruncateAt.END);
                // Re-assign text to ensure ellipsize is performed correctly.
                textView.setText(model.getText());
            }
        }
    });

3

Якщо у вас є ця проблема, і у вас TextViewвсередині RelativeLayout, спробуйте переключитиRelativeLayout дляLinearLayout .

Це вирішило для мене проблему


Це єдине рішення, яке працює для мене (дивна поведінка)! Thx
mrroboaat

1
Як можна просто "перейти" з RelativeLayout на LinearLayout? Якщо ви маєте розташувати відносно, реалізувати з LinearLayout майже неможливо.
Неймовірний січень

3

Ви можете використовувати глобальний слухач верстки для TextView в будь-якому типі ViewGroup.

    final TextView dSTextView = (TextView)findViewById(R.id.annoyingTextView);
dSTextView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        dSTextView.getViewTreeObserver().removeOnGlobalLayoutListener(this);

        float lineHeight = dSTextView.getLineHeight();
        int maxLines = (int) (dSTextView.getHeight() / lineHeight);

        if (dSTextView.getLineCount() != maxLines) {
            dSTextView.setLines(maxLines);
        }

    }
});

Більше про це можна прочитати тут


1

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

Я впевнений, що я експериментував і перевіряв те, що ви можете встановити атрибути шрифту в коді після того, як подання буде завищене. Я припускаю, що у вас є шрифт у папці "Активи / шрифти", який вам потрібен.

Наприклад, у фрагменті:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_view, container, false);
    TextView tv = (TextView)view.findViewById(R.id.text_view);
    tv.setText("Insert text that needs to be displayed");
    AssetManager assetManager = getContext().getAssets();
    Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf");
    tv.setTypeface(typeFace , 0); // 0 is normal font
    tv.setPadding(10,  0, 10, 0); // This is not mandatory
}

І в діяльності:

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(Resource.Layout.main_activity);
    TextView tv = (TextView)this.findViewById(R.id.text_view);
    tv.setText("Insert text that needs to be displayed");
    AssetManager assetManager = getContext().getAssets();
    Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf");
    tv.setTypeface(typeFace , 0); // 0 is normal font
    tv.setPadding(10,  0, 10, 0); // This is not mandatory
}

1

У мене ця сама проблема, і її дуже дратує.

Це відбувається лише з арабським текстом.

Якщо ви зробите мітку багаторядковою та додасте a \n в кінці рядка, це буде виправлено, але проблема полягає в тому, що між цією міткою та об'єктом під нею буде великий розрив через те, що це поле тепер є новий порожній рядок під ним.

Для подолання цього може бути зроблений спеціальний контроль. Але в цілому це дратівлива помилка.


Якщо у вас є НОВЕ запитання, поставте його, натиснувши кнопку Задати питання . Якщо у вас є достатня репутація, ви можете підтримати це питання. Крім того, "позначайте" це зірочкою як улюбленого, і вам буде повідомлено про будь-які нові відповіді.
Martijn Pieters

0

Найкраще для цього вирішити проблему - додати макетний вигляд потрібної висоти (тобто це додасть саму прокладку) внизу огляду.

<TableRow
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:layout_marginLeft="5dp"
 android:layout_marginRight="5dp" >
     <View 
       android:layout_width="match_parent" 
       android:layout_height="30dp"/>
</TableRow>

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


0

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

android:ellipsize="marquee"
android:layout_weight="1"

0

Додайте прокладки в нижній частині перегляду тексту:

android:paddingBottom="24dp"

-1

Я нарешті це виправив!

Я намагаюся додати String до TextView в службі, а потім зателефонуйте scrollTo (), останній рядок буде відрізаний!

ScrollTo () повинен викликати "Runnable", наприклад:

private ScrollView mScrollView;
public void scrollToBottom()
{
    mScrollView = (ScrollView) findViewById(R.id.debug_textview_scrollview);
    mScrollView.post(new Runnable()
    {
        public void run()
        {
            mScrollView.fullScroll(View.FOCUS_DOWN);
        }
    });
}

Я думаю, що в монеті виклику scrollTo () в сервісі оновлення TextView не готове.

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