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
.
Почему он не дает мне правильное значение и как я могу достичь нужного значения?
Ответы
Ответ 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());
}
}