GetMeasuredHeight() TextView с завернутым текстом - программирование
Подтвердить что ты не робот

GetMeasuredHeight() TextView с завернутым текстом

Я пытаюсь определить высоту TextView до, которую она рисует. Для этого я использую следующий код:

TextView textView = (TextView) findViewById(R.id.textview);
textView.setText("TEST");
int widthSpec = MeasureSpec.makeMeasureSpec(LayoutParams.MATCH_PARENT, MeasureSpec.EXACTLY);
int heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
textView.measure(widthSpec, heightSpec);
System.out.println("MeasuredHeight: " + textView.getMeasuredHeight());

Выходной сигнал MeasuredHeight: 28. В этом нет ничего плохого.

Однако, когда я даю TextView длинную текстовую строку, поэтому происходит перенос, она по-прежнему дает высоту одной строки вместо двух:

(...)
textView.setText("TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST");
(...)

Вывод MeasuredHeight: 28, где я ожидал бы MeasuredHeight: 56.

Почему он не дает мне правильное значение и как я могу достичь нужного значения?

4b9b3361

Ответ 1

Это метод onCreate. Вся ваша иерархия представлений пока не измерена и не составлена. Поэтому родитель textView не знает его ширины. Вот почему параметры textView не ограничены родительскими размерами.

Попробуйте изменить свою строку на:

int widthSpec = MeasureSpec.makeMeasureSpec(200, MeasureSpec.EXACTLY);

чтобы ваша ширина текста была равна 200 пикселям.

Если вы объясните, почему вам нужна высота текста, возможно, мы сможем вам помочь.

Ответ 2

Да, я недавно столкнулся с этим сам. Лучший способ - создать объект ViewTreeObserver и зарегистрировать ViewTreeObserver.OnGlobalLayoutListener. Это будет вызываться после фазы компоновки и до фазы рисования. Вы сможете получить размер вашего TextView в этот момент.

Это не будет строго говоря языком, а для всего TextView. Если есть внутреннее дополнение, фактический текст будет меньше, чем TextView.

Если вам действительно нужны размеры фактического текста, используйте textView.getLayout(), чтобы получить объект Layout для текста, а затем используйте layout.getHeight().

Ответ 3

Вам нужно создать Custom Textview и использовать его в своих макетах и ​​использовать функцию высоты getActual для установки высоты во время выполнения

 public class TextViewHeightPlus extends TextView {
    private static final String TAG = "TextViewHeightPlus";
    private int actualHeight=0;


    public int getActualHeight() {
        return actualHeight;
    }

    public TextViewHeightPlus(Context context) {
        super(context);
    }

    public TextViewHeightPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewHeightPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

   @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        actualHeight=0;

        actualHeight=(int) ((getLineCount()-1)*getTextSize());

    }

}