Android: myTextView.getLineCount()/getHeight() = 0?

Я хочу программно получить высоту или, по крайней мере, количество строк моего текстового представления, но в журнале указано 0. Что не так? Вот мой код:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_off);

    titreOff = (TextView) findViewById(R.id.offTitre);
    titreOff.setText("some text"); // displays 2 lines of text with the font size I used
    System.out.println(titreOff.getLineCount() + " and " + titreOff.getHeight());
}

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


person Rob    schedule 16.07.2012    source источник
comment
Возможный дубликат textview.getLineCount всегда 0 в android   -  person cammando    schedule 06.02.2017


Ответы (3)


В onCreate() у вашего TextView не было прохода макета, поэтому в настоящее время он имеет нулевую ширину и высоту. Есть несколько решений, если вы хотите получить размеры вашего TextView:

  1. Добавьте OnGlobalLayoutListener к ViewTreeObserver TextView. (например, titreOff.getViewTreeObserver().addOnGlobalLayoutListener(listener) и обработайте там свои изменения).

  2. Переопределите TextView и обработайте свой особый случай, переопределив onLayout() (в котором у вас будут размеры вашего TextView в качестве параметров.

В качестве альтернативы, какова конечная цель ваших измерений? Если вы можете дать некоторые подробности, может быть более простое решение, чем любое из этого.

person Kevin Coppock    schedule 16.07.2012
comment
Предупреждаю, не повторяйте мою ошибку и не вносите изменения в макет внутри слушателя — это приведет к бесконечному повторному входу в слушатель. Если вам действительно нужно внести изменения в макет в слушателе, вы должны удалить прослушиватель внутри себя (т.е. titreOff.getViewTreeObserver().removeGlobalOnLayoutListener(this) в методе onGlobalLayout(). - person Kevin Coppock; 16.07.2012
comment
Вариант № 1 работает ненадежно (для getLineCount обычно возвращается 0 внутри OnGlobalLayout, несмотря на то, что представление содержит текст). Вам, вероятно, придется пойти с вариантом № 2. - person ; 12.05.2014

Ваше приложение не знает фактический размер TextView при выполнении метода onCreate(). Решение состоит в том, чтобы переместить ваш вывод сюда:

onWindowFocusChanged(boolean hasFocus) {
    if (!hasFocus) {
        titreOff = (TextView) findViewById(R.id.offTitre);
        System.out.println(titreOff.getLineCount() + 
        " and " + titreOff.getHeight());
    }
}
person user1049280    schedule 16.07.2012
comment
Я понимаю, что вы пытаетесь сделать, но когда я это делаю, он возвращает правильное значение только при выходе из представления, а не при входе в него... - person Rob; 16.07.2012

setText() не сразу обновляет TextView, а просто делает его недействительным. Новый текст будет установлен только при следующей перерисовке. Если вы попытаетесь получить высоту раньше, вы получите старую.

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

person Dalmas    schedule 16.07.2012