Моя программа считывает данные из файла и отображает их в 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 Повторюсь, способ не проверенный
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Необходима помощь вот каком вопросеНаписал запросы к БД, на что было получено замечание, что "использование ps неэффективно"
Есть задача - создать веб-приложение по типу CRM (база данный клиентов и работа с ней) с возможностью подсоединения его к api разных сервисов,...