Моя программа считывает данные из файла и отображает их в TextView. Мне нужно определить количество виртуальных страниц, на которые разбивается текст файла. Высота/ширина одной страницы = высоте/ширине всего экрана. Алгоритм, как посчитать, я разработал. Вот код:
countOfLines = (text.getHeight() / text.getLineHeight());
pages = Math.round(text.getLineCount() / countOfLines) + 1;
pagesView.setText(currentPage + "/" + pages);
text - TextView с текстом.
countOfLines - кол-во страниц.
pagesView - TextView в котором отображается кол-во страниц.
Итак, проблема заключается в том, мне нужно определять количество страниц сразу после отображения содержимого, но когда я пытаюсь выполнить этот код в любом из методов жизненного цикла, text.getHeight() всегда возвращает 0. Но за пределами методов жизненного цикла приложение возвращает корректное значение. Так как мне быть?
Во время вызова методов активити onCreate(...), onStart() и onResume() виджеты еще не отрисованы на экране, поэтому, в частности, метод getHeight() возвращает ноль.
Стоит обратить внимание на то, что если Вы откроете активити, затем свернете приложение и снова вернетесь в него (при условии, что активити не была уничтожена), в коллбэках onStart() и onResume() метод getHeight() виджета вернет корректное значение.
Корректные размеры виджета можно получить после его отрисовки. Поймать событие окончания отрисовки (в частности его) можно с помощью установки OnGlobalLayoutListener объекта ViewTreeObserver соответствующего виджета и реализации метода onGlobalLayout():
mTextView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int textViewHeight = mTextView.getHeight();
}
});
После получения результата не забудьте удалить установленный OnGlobalLayoutListener (так как метод onGlobalLayout() будет вызываться при каждой перерисовке view).
Вероятно вы пытаетесь получить высоту в onCreate()? Дело в том, что пока этот метод не выполнится View не получат размерность. Получить высоту вы сможете только после метода onCreate(), например, при программном нажатии на TextView
Барабанная дробь... (не уверен, так как не пробовал)
LIFEHACK
В xml в тэг TextView добавьте
android:clickable = "true"
Когда вам надо получить высоту TextView (продумайте логику так, чтобы этот метод вызвался не в onCreate()), нажимайте программно на него
textView.performClick();
Слушатель в onCreate()
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TextView tv = ((TextView)v);
float height = tv.getHeight();
}
}
P.S
Все же попробуйте вызвать performClick в onCreate(). Я думаю, что View который приходит в метод должен знать свою высоту
P.S.S Повторюсь, способ не проверенный
Сборка персонального компьютера от Artline: умный выбор для современных пользователей