Android multiline TextView, проверьте, подходит ли текст, или проверьте, что TextView заполнен

У меня есть макет приложения для Android, который содержит многострочный TextView. Когда экран находится в портретной ориентации, TextView может отображать другую длину текста при работе в ландшафтном режиме. Кроме того, при работе на маленьком экране TextView может отображать другую длину текста при работе на большем экране.

Есть ли способ проверить, подходит ли текст или будет усечен? Или я могу проверить, действительно ли TextView заполнен?

Проблема заключается в том, что TextView потенциально может содержать различное количество строк, в зависимости от того, пейзаж - это портрет, маленький экран, большой экран и т.д.

Спасибо за ваш совет,

С уважением,

Джеймс

Ответ 1

Эти ответы не очень хорошо для меня. Вот что я в итоге сделал

Paint measurePaint = new Paint(myTextView.getPaint());
float pWidth = measurePaint.measureText("This is my big long line of text. Will it fit in here?");
float labelWidth = myTextView.getWidth();
int maxLines = myTextView.getMaxLines();

while (labelWidth > 0 && pWidth/maxLines > labelWidth-20) {
    float textSize = measurePaint.getTextSize();
    measurePaint.setTextSize(textSize-1);
    pWidth = measurePaint.measureText("This is my big long line of text. Will it fit in here?");
    if (textSize < TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP, 7,
            getContext().getResources().getDisplayMetrics())) break;
}

myTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, measurePaint.getTextSize());

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

Ответ 2

Я нашел "дерзкое" решение проблемы измерения высоты текста в MULTILINE TextView : -

//Calculate the height of the text in the MULTILINE TextView
int textHeight = textView.getLineCount() * textView.getLineHeight();
if (textHeight > textViewHeight) {
    //Text is truncated because text height is taller than TextView height
} else {
    //Text not truncated because text height not taller than TextView height
}

Однако это решение имеет некоторые оговорки: -

Во-первых, в отношении getLineHeight() разметка в тексте может привести к тому, что отдельные строки будут выше или короче этой высоты, а макет может содержать дополнительное заполнение первой или последней строки. См. http://developer.android.com/reference/android/widget/TextView.html#getLineHeight()

Во-вторых, приложение должно вычислять фактическую высоту TextView в пикселях, и (в случае моего макета) это может быть не так просто, как textView.getHeight(), и расчет может отличаться от одного макета к другому макета.

Я бы рекомендовал избегать LinearLayout, потому что фактическая высота пикселя TextView может варьироваться в зависимости от текстового содержимого. Я использую RelativeLayout (см. http://pastebin.com/KPzw5LYd).

Используя этот RelativeLayout, я могу вычислить высоту TextView следующим образом: -

//Calculate the height of the TextView for layout "http://pastebin.com/KPzw5LYd"
int textViewHeight = layout1.getHeight() - button1.getHeight() - button2.getHeight();

Надеюсь, что это поможет,

Привет,

Джеймс

Ответ 3

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

Внутри метода ориентации изменения:

main_view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            main_view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            //Calculation goes here
            int text_size = getTextSize(text_view.getText().toString());
            int text_view_size = text_view.getLayoutParams().width;
            //Compare your text_size and text_view_size and do whatever you want here.
        }
    });

Вот код вычисления text_size:

private int getTextSize(String your_text){
    Paint p = new Paint();
    //Calculate the text size in pixel
    return p.measureText(your_text);
}

Надеюсь на эту помощь.

Ответ 4

Чтобы проверить, будет ли усечен многострочный (или нет) TextView, отметьте этот пост.

Или вы изучали использование прокручиваемого текста? (marquee).. где текст будет прокручиваться (горизонтально, анимированный), если он слишком длинный для заданной ширины?

Вот пример TextView в файле макета, который имеет некоторые из этих характеристик:

<TextView
    android:id="@+id/sometextview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:singleLine="true"
    android:scrollHorizontally="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:freezesText="true"
    android:textColor="#808080"
    android:textSize="14sp"
    android:text="This is a long scrolling line of text.. (etc)"/>