Сколько текста можно установить в TextView, чтобы не было необходимости прокручивать - PullRequest
4 голосов
/ 24 января 2011

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

Ответы [ 4 ]

1 голос
/ 02 февраля 2011

Мне действительно нужно что-то подобное.Мне нужна была ширина 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 голос
/ 24 января 2011

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

Создайте новый класс, расширяющий 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.

0 голосов
/ 02 февраля 2011

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

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

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

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

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