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

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

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

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

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

С наилучшими пожеланиями,

Джеймс

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

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 и продолжать сжимать его, пока он не поместится внутри текстового поля.

Я нашел «дерзкое» решение проблемы измерения высоты текста в 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(); 

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

С Уважением,

Джеймс

В принципе, вам нужно рассчитать размер вашего текстового поля и размер вашего текста при изменении режима ориентации. Попробуйте 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); } 

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

Для проверки того, будет ли усекаться многострочный (или нет) 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)"/> 
Intereting Posts
Как извлечь и просмотреть файлы cookie из Android Chrome? Множественный выборщик Android-камера фокусируется только один раз Присоединение PDF к электронной почте из приложения Android – Размер файла равен нулю Использование Android AccountManager для получения authtoken для gdata Проецирование непроектированных радарных изображений в osmdroid Ошибка: идентификатор ресурса не найден для атрибута 'groupindicator' в пакете 'android' Gcm GoogleCloudMessaging новая реализация Не удалось установить параметры камерыПараметры: FATAL EXCEPTION Приложение чата – какой из технологий лучше реализовать приложение для чата в Android Android Build Tools создает только x86_64, несмотря ни на что. APK запускается через adb, но демонстрирует несовместимость в Play Маркете Изменение имени пакета Android для проекта phonegap Как ссылаться на актив в проекте библиотеки Что такое фатальный сигнал 6 в logcat android Другие ресурсы меню для Android