Сколько текста может быть установлено в TextView, так что ему не нужно прокручивать

Сколько текста можно задать в текстовом виде для определенной текстовой строки с определенным шрифтом и размером, чтобы текст не нужно прокручивать. Я имею в виду, сколько текста может быть помещено внутри TextView без необходимости прокрутки. Это похоже на Как определить, какой текст будет вписываться в TextView в Android? , Но я не могу найти рабочее решение. Пожалуйста помоги.

Предполагая, что вы уже искали другие варианты, и нет простого способа сделать это, вот теоретический (я его не проверял) хакерский подход, который может сработать.

Создайте новый класс, который расширяет TextView. Затем переопределите метод, который будет вызываться после обновления содержимого TextView. Может быть, лучший способ использовать, но для этого примера давайте попробуем onDraw (). Этот метод будет проверять ширину и видеть, нужно ли ее прокручивать. Если это так, он обрезает строку и задает текст. Он будет делать это в цикле, пока ему не потребуется прокручивать его дольше.

@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(getWidth() < computeHorizontalScrollRange()){ // Requires scrolling, the string is too long // Do whatever you need to do to trim the string, you could also grab the remaining string and do something with it. // Set the TextView to use the trimmed string. } } 

Вы хотели бы убедиться, что он не попал в бесконечный цикл, а также проверить, равна ли ширина.

Вы также можете посмотреть различные варианты android:ellipsize .

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

 import android.content.Context; import android.util.AttributeSet; import android.util.TypedValue; import android.widget.TextView; /** * The text inside this TextView will resize to fit. * It will resize until it fits within the view and padding */ public class FitTextView extends TextView { private float defaultSize = 12; public FitTextView(Context context) { super(context); } public FitTextView(Context context, AttributeSet attrs) { super(context, attrs); defaultSize = getTextSize(); } public FitTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); defaultSize = getTextSize(); } /** * Set the default size. This size is set every time the * view is resized. * @param size */ public void setDefaultSize(float size) { defaultSize = size; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { setTextSize(TypedValue.COMPLEX_UNIT_PX, defaultSize); fitCharsInView(); super.onSizeChanged(w, h, oldw, oldh); } @Override public void setText(CharSequence text, BufferType type) { fitCharsInView(); super.setText(text, type); } /** * Decreases the text size until it fits inside the view */ public void fitCharsInView() { int padding = getPaddingLeft() + getPaddingRight(); int viewWidth = getWidth() - padding; float textWidth = getTextWidth(); int iKillInfite = 0; int maxIteration = 10000; while(textWidth > viewWidth && iKillInfite < maxIteration) { iKillInfite++; float textSize = getTextSize(); setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize-1); textWidth = getTextWidth(); } } /** * Gets the width in pixels of the text * @return */ private float getTextWidth() { return getPaint().measureText(getText().toString()); } } 

Это просто быстрый мозговой штурм:

  1. Измерять длину текста в символах
  2. Получить информацию о размерах экрана и плотности
  3. Получить размер шрифта, высоту строки
  4. Вычислить приблизительное количество пространства, которое данная строка займет, учитывая приведенные выше данные
  5. Разделите строку соответственно

Я бы расширил класс TextView и переопределил onLayout() чтобы обрезать строку до тех пор, пока измеренная высота больше, чем computeHorizontalScrollRange() .

Я считаю, что решение немного лучше, потому что:

  1. Он только обрезает текст один раз (когда создается представление);
  2. Вы можете легко сохранить «обрезанный» текст, если вы хотите восстановить его в будущем;
  3. ООП потрясающе.