Проблема с TextView

344
04 марта 2017, 03:09

Моя программа считывает данные из файла и отображает их в 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. Но за пределами методов жизненного цикла приложение возвращает корректное значение. Так как мне быть?

Answer 1

Во время вызова методов активити 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).

Answer 2

Вероятно вы пытаетесь получить высоту в 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 Повторюсь, способ не проверенный

READ ALSO
работа с JDBC и запросы к БД

работа с JDBC и запросы к БД

Необходима помощь вот каком вопросеНаписал запросы к БД, на что было получено замечание, что "использование ps неэффективно"

296
Выбираю какой язык изучать - Java или Python [требует правки]

Выбираю какой язык изучать - Java или Python [требует правки]

Есть задача - создать веб-приложение по типу CRM (база данный клиентов и работа с ней) с возможностью подсоединения его к api разных сервисов,...

377
Добавление элемента в массив с циклом

Добавление элемента в массив с циклом

Есть такая конструкция

296