TextView заполняется динамически, обрезая последнюю строку текста - PullRequest
5 голосов
/ 16 ноября 2011

Я не уверен, что это только «последняя строка», но у нас есть приложение с TextView с fill_parent width, wrap_content height. Текст вставляется туда динамически из кода Java. Последняя строка текста просто не отображается, хотя в макете достаточно места. Это внутри довольно глубокой иерархии представлений, так что я предполагаю, что мера логики здесь запутана, но это довольно неприятно. Нам нужно угадать, сколько строк будет в тексте, и установить соответственно «android: lines», чтобы оно заработало.

Кто-нибудь видел это? В коде см. Id 'contentTextView' внизу. Если я уберу «android: lines», последняя строка текста исчезнет.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/flag"
        >

    <include android:id="@+id/incHeader" layout="@layout/header"/>

    <FrameLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1">

        <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical">

            <ImageView
                    android:layout_width="fill_parent"
                    android:layout_height="101dp"
                    android:background="@drawable/headershadow"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:visibility="invisible"
                    android:layout_weight="1"/>


            <ImageView
                    android:layout_width="fill_parent"
                    android:layout_height="101dp"
                    android:background="@drawable/footershadow"/>

        </LinearLayout>

        <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/gybcontentback"
                android:layout_gravity="center_horizontal"
                android:orientation="vertical">

            <include android:id="@+id/gybHeaderInclude" layout="@layout/gybcontentheader"/>


                <TextView
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:textColor="#4f4f4f"
                        android:paddingLeft="15dp"
                        android:paddingRight="15dp"
                        android:lines="9"
                        android:id="@+id/contentTextView"/>

            <ImageView
                    android:layout_marginTop="15dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/button_blue_rascal_button"
                    android:id="@+id/buttonMoreInfo"/>

        </LinearLayout>

    </FrameLayout>


    <include android:id="@+id/incFooter" layout="@layout/menu"/>

</LinearLayout>

Java-код. Я заполняю TextView стандартной строкой Java во время onCreate.

@Override
protected String body()
{
    return "Rascal Flatts and The Jason Foundation, Inc. are working together to prevent suicide.\n\n" +
            "Your Battle Buddy (or family member) may need a friend.\n\n" +
            "Take the pledge to B1.";
}

Базовый класс вызывает это, чтобы получить фактический текст

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(contentView());
    wireMenu();

    TextView headerText = (TextView) findViewById(R.id.gybHeaderText);
    if(headerText != null)
        headerText.setText(header());

    ((TextView) findViewById(R.id.contentTextView)).setText(body()); // This is where the text is set
}

Во всяком случае, я кипятил это. Я вырезал детали, чтобы посмотреть, что осталось, и все еще получаю ту же проблему. Я думаю, что, возможно, нашел триггер и решение, но не «причину».

Ответы [ 7 ]

7 голосов
/ 04 декабря 2011

У меня такая же проблема.Я нашел обходной путь.Добавьте новую строку "\ n" к вашему тексту.Это всегда будет показывать весь ваш текст.

2 голосов
/ 05 декабря 2013

Вы пытались окружить ваш TextView напрямую с помощью LinearLayout, для ширины и высоты которого установлено значение wrap_content?

Это сработало для меня ...

1 голос
/ 14 марта 2016

У меня была другая проблема, но похожая.Вот решение, которое, я думаю, работает и для того, что вам нужно.Вы можете использовать прослушиватель глобального макета для 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 голос
/ 16 ноября 2011

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/flag"
        >


    <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:orientation="vertical">

            <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#4f4f4f"
                    android:id="@+id/contentTextView"/>

            <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/button_blue_rascal_button"
                    android:id="@+id/buttonMoreInfo"/>

        </LinearLayout>



</LinearLayout>

Проблема, я думаю, в том, что родительский LinearLayout получает свою ширину из ImageView внутри него.Где-то в этом миксе TextView получает неправильное значение для своей запрошенной высоты.Я полагаю, это связано с тем, как рассчитывается пользовательский интерфейс.Родитель должен спросить детей об их запрашиваемой ширине, затем вернуться и рассказать всем, какова их ширина, а затем попросить высоту.Что-то вроде того.Во всяком случае, работает следующее.Ширина изображения составляет 263 пикселя (в мдпи), поэтому, если я установлю 263dp вместо wrap_content на родительском макете, все будет в порядке.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/flag"
        >


    <LinearLayout
                android:layout_width="263dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:orientation="vertical">

            <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#4f4f4f"
                    android:id="@+id/contentTextView"/>

            <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/button_blue_rascal_button"
                    android:id="@+id/buttonMoreInfo"/>

        </LinearLayout>



</LinearLayout>

Установка TextView в wrap_content также работает, хотя затем она выдвигаетвесь макет больше, чем я хочу.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@drawable/flag"
        >


    <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:orientation="vertical">

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="#4f4f4f"
                    android:id="@+id/contentTextView"/>

            <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/button_blue_rascal_button"
                    android:id="@+id/buttonMoreInfo"/>

        </LinearLayout>



</LinearLayout>

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

0 голосов
/ 28 августа 2017

Поместите ваш проблемный TextView в FrameLayout (или некоторый контейнер). Я думаю, что проблема из-за вашего взгляда родного брата.

0 голосов
/ 18 января 2017

попробуйте добавить

android: padding

в вашем TextView.работал на меня

0 голосов
/ 16 ноября 2011

Вы пробовали

android:singleLine="false" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...