Андроид не показывает надписи

Содержание
  1. В телефоне не показывает кто звонит как настроить
  2. Нет уведомления о звонке. Что делать
  3. Видео
  4. Неверное определение сети
  5. Что делать, если не высвечивается входящий звонок на Андроид
  6. Перезагрузка телефона
  7. Очистка кэша и данных
  8. Сброс настройки приложений
  9. Очистить кеш и данные
  10. Проверьте режим Не беспокоить (DND)
  11. Включите уведомления для входящих звонков
  12. Отключение автояркости частая проблема
  13. Как настроить уведомления о входящих звонках на Анроиде
  14. Отображение текста в Android
  15. TextView под капотом
  16. Измерение длины текста и перенос строк
  17. Стили текста
  18. Spans
  19. Appearance vs metric affecting spans
  20. Character vs paragraph affecting spans
  21. Написание своих span’ов
  22. Использование span’ов в тексте
  23. Проверка на наличие span’а в тексте
  24. Разметка текста в различных языковых ресурсах
  25. Как текст располагается в TextView
  26. Производительность TextView
  27. Ускорение показа текста
  28. Показ большого текста
  29. Что нужно знать, когда устанавливаешь текст в TextView
  30. Использование autoLink
  31. Magnifier
  32. Заключение

В телефоне не показывает кто звонит как настроить

Нет уведомления о звонке. Что делать

У этой проблемы может быть две причины. Первая – когда у приложения «Телефон» нет разрешения на взаимодействие с функцией приёма и отправки звонков. Решается она следующим образом:

  • Перейдите в «Настройки» и откройте раздел «Приложения»;
  • Найдите приложение «Телефон», установленное по умолчанию;

Дайте приложению разрешение на работу с функцией «Телефон»

  • Перейдите в раздел «Права» и откройте вкладку «Телефон»;
  • Установите галочку или точку напротив пункта «Разрешить».

Однако не исключено, что может потребоваться ещё кое-что. Возможно, что всё дело в том, что вы банально отключили уведомления для приложения «Телефон». Значит, нужно их включить:

  • Перейдите в «Настройки» и откройте «Уведомления»;
  • Выберите приложение «Телефон» — «Входящие вызовы»;

Уведомления должны быть включены — проследите за этим

  • Здесь откройте вкладку «Уведомления на экране блокировки»;
  • Включите пункт «Показывать» и сохраните изменения.

Видео

Неверное определение сети

Еще одна причина, по которой входящие вызовы не отображаются – это неправильное определение мобильной сети. Изначально гаджет самостоятельно определяет сеть и работает внутри нее. Однако иногда возникают сбои, которые можно решить следующим способом:

  1. Перейти в настройки телефона, а после этого – в меню сим-карт.
  2. После этого выбрать раздел с «Мобильными сетями» и поставить там определение или на самостоятельный режим, или произвести поиск с последующим определением подходящей под сотового оператора сети.

Обычно после этого сеть и СИМ-карта перенастраиваются, а входящие вызовы начинают отображаться.

Что делать, если не высвечивается входящий звонок на Андроид

Ситуаций может быть множество. В одном случае просто не высвечивается входящий звонок на Андроид, хотя звук есть и трубку взять можно, но с помощью аналоговых клавиш. В другом случае дозвониться просто не получается и входящие звонки на Андроид не отображаются. Бывает и наоборот: не гаснет экран при разговоре Андроид.

Часто все эти ошибки и баги объединяют одни и те же причины, которые заключаются в большом количестве мусорных файлов, неправильных или сбившихся настройках операционной системы, установленном авиарежиме, а также в отсутствии разрешений на использование тех или иных компонент приложением «Телефон». Ниже будет представлено подробное объяснение того, как решить проблему, когда не загорается экран при входящем звонке Андроид.

Выполнение перезагрузки позволяет решить множество проблем

Перезагрузка телефона

Люди пренебрегают этим полезным действием и всегда стараются решить ошибки по-другому. Многие проблемы с современными гаджетами можно решить простой перезагрузкой. Связано это с тем, что за время работы телефон копит в своей оперативной памяти множество файлов мусора и временных данных. Не редко они начинают конфликтовать между собой и с приложениями и не дают последним корректно работать.

Если человек долгое время не выключал и не перезагружал свой девайс, то есть высокая вероятность того, что на его Андроид не отображается звонок вызова на экране из-за того, что ОЗУ его переполнена различным мусором и нуждается в очистке.

Важно! Рекомендуется выполнить рестарт операционной системы и проверить, появляется ли ошибка. Если да, то переходят к следующим пунктам.

Очистка кэша и данных

Не редко ошибка подобного плана возникает и из-за переполненности кэша и данных приложения «Телефон». Файлы, которые там хранятся, представляют собой кэш и временные данные для более быстрой и оптимизированной работы программы. Они также могут вступать в конфликт с другими параметрами или сами с собой. Все это в конечном итоге и вызывает известную ошибку с черным дисплеем при вызове.

Для решения проблемы рекомендуют:

  1. Перейти в «Настройки» своего гаджета.
  2. Выбрать пункт «Приложения» и подпункт «Все» или «Системные».
  3. Найти приложение «Телефон» и нажать на него.
  4. Нажать на кнопки «Удалить данные» и «Удалить кэш». Часто они объедены в одну.
  5. Дождаться очистки.
  6. Проверить работоспособность программы.

Очистка кэша помогает, если не показывает входящий вызов андроид

Сброс настройки приложений

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

Если есть твердое желание сделать сброс настроек приложений, то нужно:

  1. Разблокировать свой телефон.
  2. Перейти в приложение «Настройки».
  3. Выбрать из меню параметров раздел «Сброс и восстановление».
  4. Если его нет, то перейти в «Безопасность» и пролистать вниз до параметра «Сброс».
  5. Выполнить удаление всех приложений и конфигураций.
  6. Перезагрузиться в обновленный и чистый телефон.

Очистить кеш и данные

Еще одно простое решение, которое вы должны попробовать — очистить кеш для приложения «Телефон». Не волнуйтесь, это не приведет к удалению ваших данных. Если очистка кеша не помогает, удалите данные для приложения. Обратите внимание: очистка данных приведет к очистке истории вызовов и сбросу настроек приложения «Телефон».

Чтобы очистить кеш и данные, выполните следующие действия:

Шаг 1: Откройте Приложения / Диспетчер приложений в разделе «Настройки».

Шаг 2: Нажмите на приложение «Телефон», а затем на «Память».

Шаг 3: Сначала нажмите Очистить кеш. Перезагрузите устройство и посмотрите, исчезла ли проблема. Если он все еще там, нажмите Очистить данные / хранилище в зависимости от опции, доступной на вашем телефоне.

Проверьте режим Не беспокоить (DND)

Режим «Не беспокоить», который отличается от беззвучного режима, имеет функцию, которая блокирует любые прерывания в виде визуальных уведомлений. То есть вы получите уведомление в панели уведомлений, но не будет никаких звуковых или всплывающих уведомлений.

Если эта функция включена, она также может нести ответственность за ваши жалобы. Чтобы исправить это, выполните шаги, указанные ниже.

Шаг 1: Откройте «Настройки» и перейдите в «Звук».

Шаг 2: Нажмите «Не беспокоить» и убедитесь, что он выключен.

Однако, если вы предпочитаете использовать «Не беспокоить», нажмите «Уведомления» и проверьте, не выбрано ли «Нет изображения или звука из уведомлений». Измените его на «Нет звука из уведомлений». При этом вы будете получать всплывающие окна с уведомлениями без звука.

Также проверьте, установлен ли режим «Не беспокоить» на автоматическое включение. Иногда это также может создавать проблемы.

Включите уведомления для входящих звонков

Конечно, на каждом телефоне, подобные уведомления должны быть включены по умолчанию. Но полагаться на это не стоит. Если возникает проблема, следует зайти в «Настройки» устройства» и выбрать «Приложения» (название может отличаться в зависимости от модели смартфона), «Телефон». Возле пункта «Показывать уведомления» должна стоять галочка или ползунок в правой стороне.

Читайте также:  Адгуард контент блокер для андроид

Лайфхак! Открыть настройки приложения «Телефон» можно путем 2-3 секундного нажатия на значок трубки на главном экране.

Отключение автояркости частая проблема

У современных телефонов есть функция автояркости — когда яркость дисплея подстраивается под окружающую освещённость, и если света вокруг много, то дисплей становится ярче, а если мало — темнее. Регуляция происходит с помощью встроенного датчика освещённости.

Когда происходит звонок, телефон обычно находится в кармане, то есть в темноте. Когда вы его достаёте в ярком месте, например, на улице, датчик не успевает обрабатывать это событие, и может сразу не сделать экран ярче. В результате вы не увидите на тусклом экране, находясь под солнцем, никаких уведомлений, и вам будет казаться, что на экране ничего нет, хоть и идёт звонок. Ситуация усугубится, если на вас надеты солнцезащитные очки.

Этим страдают, как правило, бюджетные или неоригинальные модели. Решается отключением функции автояркости.

Для этого сделайте следующее:

  1. Зайдите в настройки.
  2. Откройте раздел «Экран и яркость».
  3. Отключите опцию «Авто».
  4. Теперь яркость можно будет настраивать вручную. Рекомендуется установить на максимум или близкий к этому показатель.

Как настроить уведомления о входящих звонках на Анроиде

Иногда также хозяину гаджета могут просто не приходить уведомления о входящих вызовах. Чаще всего это тоже связано с разрешениями на них, которые устанавливаются в настройках. Для конфигурирования:

  1. Переходят в настройки смартфона.
  2. Находят раздел «Приложения и уведомления».
  3. Выбирают список системных программ и находят среди них «Телефон».
  4. Настраивают не разрешение на использование функций и модулей ОС, а на показ уведомлений.
  5. Включают общее разрешение и ряд дополнительных. Они содержат возможность показа уведомлений в соответствующей панели, настройки светового индикатора при пропущенном вызове и так далее.

Важно! Если это не помогло, то тут же можно выполнить очистку данных и кэша программы «Телефон». Процесс и его суть подробно были разъяснены в подпункте выше.

Источник

Отображение текста в Android

Отображение текстовой информации — наверное, самая базовая и важная часть многих Android-приложений. В данной статье пойдет речь о TextView. Каждый разработчик, начиная с «Hello World», постоянно сталкивается с этим элементом пользовательского интерфейса. Периодически в работе с текстом приходится задумываться о реализации различных дизайнерских решений или улучшении производительности при отрисовке экрана.

Я расскажу об устройстве TextView и некоторых тонкостях работы с ним. Основные советы были взяты из докладов прошедших Google I/O.

TextView под капотом

Для отрисовки текста в Android под капотом используется целый стек из различных библиотек. Их можно разделить на две основные части — java-код и нативный код:

Java-код по сути является частью Android SDK, доступной разработчикам приложений, и новые возможности из него могут быть перенесены в support library.

Само ядро TextView написано на C++, что ограничивает портирование в support library реализованных там новых возможностей из новых версий операционной системы. Ядро представляет из себя следующие библиотеки:

  • Minikin используется для измерения длины текста, переноса строк и слов по слогам.
  • ICU обеспечивает поддержку Unicode.
  • HarfBuzz находит для символов юникода соответствующие графические элементы (глифы) в шрифтах.
  • FreeType делает растровые изображения глифов.
  • Skia – движок для рисования 2D графики.

Измерение длины текста и перенос строк

Если передать строку библиотеке Minikin, которая используется внутри TextView, то первым делом она определяет, из каких глифов строка состоит:

Как можно заметить из данного примера, сопоставление символов юникода с глифами не всегда будет один к одному: здесь сразу 3 символа будут соответствовать одному глифу ffi . Кроме того, стоит обратить внимание, что нужные глифы могут быть найдены в различных системных шрифтах.

Поиск глифов только в системных шрифтах может повлечь за собой сложности, особенно если через символы отображаются иконки или эмодзи, а в одной строке предполагается комбинировать символы из разных шрифтов. Поэтому, начиная с Android Q (29), появилась возможность сделать свой список шрифтов, поставляемых с приложением. Этот список будет использоваться для поиска глифов:

Теперь с использованием CustomFallbackBuilder при сопоставлении символов с глифами SDK будет перебирать указанные font family по порядку, и если не удастся найти соответствие, поиск продолжится в системных шрифтах (а через метод setSystemFallback() можно указать предпочитаемый системный font family). CustomFallbackBuilder имеет ограничение на количество font family – можно добавить не более 64 шрифтов.

Библиотека Minikin разделяет строки на слова и делает измерение отдельных слов. Для ускорения работы, начиная с Lollipop (21), используется системный LRU кэш из слов. Такой кэш дает огромный выигрыш в производительности: вызов Paint.measureText() для закешированного слова займет в среднем 3% от времени первого расчета его размеров.

Если текст не помещается в заданную ширину, Minikin расставляет переносы строк и слов в тексте. Начиная с Marshmallow (23) можно управлять ее поведением, указав у TextView специальные атрибуты breakStrategy и hyphenationFrequency .

При значении breakStrategy=simple библиотека просто будет расставлять переносы последовательно, проходя по тексту: как только строка перестает помещаться, ставится перенос перед последним словом.

В значении balanced библиотека постарается сделать переносы строк так, чтобы строки оказались выровнены по ширине.

high_quality имеет почти такое же поведение, что и balanced , за исключением некоторых отличий (одно из них: на предпоследней строке перенос может быть не только отдельных слов, но и слова по слогам).

Атрибут hyphenationFrequency позволяет управлять стратегией переноса слов по слогам. Значение none не будет делать автоматический перенос слов, normal сделает небольшую частоту переносов, а full , соответственно, задействует максимальное количество слов.

Производительность отрисовки текста в зависимости от выбранных флагов (измерялась на Android P (28)):

Учитывая достаточно сильный удар по производительности, разработчики Google, начиная с версии Q (29) и AppCompat 1.1.0, решили по умолчанию выключить перенос слов ( hyphenation ). Если перенос слов важен в приложении, то теперь его надо включать явно.

При использовании переноса слов надо учитывать, что на работу библиотеки будет влиять текущий выбранный язык в операционной системе. В зависимости от языка система будет выбирать специальные словари с правилами переноса.

Стили текста

В Android есть несколько способов стилизации текста:

  • Единый стиль (single style), который применяется для всего элемента TextView.
  • Мультистиль (multi style) — сразу несколько стилей, которые могут быть применены к тексту, на уровне параграфа или отдельных символов. Для этого есть несколько способов:
    • рисование текста на канве
    • html-теги
    • специальные элементы разметки – span’ы

Единый стиль подразумевает под собой использование XML-стилей или XML-атрибутов в разметке TextView. При этом система будет применять значения из ресурсов в следующем порядке: TextAppearance, тема (Theme), стиль по умолчанию (Default style), стиль из приложения, и наибольший приоритет — значения атрибутов View.

Использование ресурсов — это достаточно простое решение, но, к сожалению, оно не позволяет применить стиль к части текста.

Html-теги – еще одно простое решение, которое дает такие возможности, как сделать стиль отдельных слов жирным, курсивным, или даже выделить в тексте списки при помощи точек. Все что нужно разработчику — сделать вызов метода Html.fromHtml() , который превратит текст с тегами в текст, размеченный span’ами. Но такое решение имеет ограниченные возможности, так как распознает только часть html-тегов и не поддерживает CSS стили.

Читайте также:  So file android ndk

Различные способы стилизации TextView можно комбинировать, но стоит помнить о приоритете того или иного метода, что будет влиять на конечный результат:

Еще один способ — рисование текста на канве — дает разработчику полный контроль над выводом текста: например, можно нарисовать текст вдоль кривой линии. Но такое решение в зависимости от требований может быть достаточно сложным в реализации и выходит за рамки этой статьи.

Spans

Для тонкой настройки стилей в TextView используются span’ы. С помощью span’ов можно изменить цвет диапазона символов, сделать часть текста в виде ссылок, изменить размер текста, нарисовать точку перед параграфом и т.д.

Можно выделить следующие категории span’ов:

  • Character spans – применяются на уровне символов строки.
    • Appearance affecting – не меняют размер текста.
    • Metric affecting – изменяют размер текста.
  • Paragraph spans – применяются на уровне параграфа.

В Android фреймворке есть интерфейсы и абстрактные классы с методами, которые вызываются во время onMeasure() и отрисовки TextView, эти методы дают доступ span’ам к более низкоуровневым объектам вроде TextPaint и Canvas . Android фреймворк, применяя span, проверяет, какие интерфейсы этот объект реализует, чтобы вызвать нужные методы.

В android фреймворке определено порядка 20+ span’ов, так что прежде чем делать свой собственный, лучше проверить, нет ли в SDK подходящего.

Appearance vs metric affecting spans

Первая категория span’ов влияет на то, как будут выглядеть символы в строке: цвет символов, цвет фона, подчеркнутые или зачеркнутые символы и т.д. Эти span’ы имплементируют интерфейс UpdateAppearance и наследуются от класса CharacterStyle , который предоставляет доступ к объекту TextPaint .

Metric affecting span влияет на размер текста и layout’а, следовательно применение такого span’а потребует не только перерисовку TextView, но и вызов onMeasure() / onLayout() . Эти span’ы обычно наследуются от класса MetricAffectingSpan , который наследуется от упомянутого выше CharacterStyle .

Character vs paragraph affecting spans

Paragraph span влияет на целый блок текста: может изменить выравнивание, отступ или даже вставить точку в начале параграфа. Такие span’ы должны наследоваться от класса ParagraphStyle и вставляться в текст ровно с начала параграфа до его конца. Если диапазон окажется неверным, то span не будет работать.

В Android параграфами считается часть текста, отделённая символами перевода строки ( \n ).

Написание своих span’ов

При написании собственных span’ов надо определиться, что будет затрагивать span, чтобы выбрать, от какого класса надо наследоваться:

  • Затрагивает текст на уровне символов → CharacterStyle
  • Затрагивает текст на уровне параграфа → ParagraphStyle
  • Затрагивает вид текста → UpdateAppearance
  • Затрагивает размер текста → UpdateLayout

Вот пример span’а для смены шрифта:

Представим, что мы хотим сделать свой собственный span для выделения блоков кода, для этого отредактируем наш предыдущий span – добавим после установки шрифта еще и изменение цвета фона текста:

Применим span к тексту:

Но точно такой же результат можно получить, скомбинировав два span’а: возьмем наш предыдущий CustomTypefaceSpan и BackgroundColorSpan из Android фреймворка:

Эти два решения будут иметь отличие. Дело в том, что самописные span’ы не могут реализовывать интерфейс Parcelable , в отличие от системных.

При передаче стилизованной строки через Intent или буфер обмена в случае самописного span’а разметка не сохранится. При использовании span’ов из фреймворка разметка останется.

Использование span’ов в тексте

Для стилизованного текста во фреймворке есть два интерфейса: Spanned и Spannable (с неизменяемой и изменяемой разметкой соответственно) и три реализации: SpannedString (неизменяемый текст), SpannableString (неизменяемый текст) и SpannableStringBuilder (изменяемый текст).

Изменяемый текст Изменяемая разметка
SpannedString нет нет
SpannableString нет да
SpannableStringBuilder да да

SpannableStringBuilder , например, используется внутри EditText , которому требуется изменять текст.

Добавить новый span к строке можно при помощи метода:

setSpan(Object what, int start, int end, int flags)

Через первый параметр передается span, затем указывается диапазон индексов в тексте. И последним параметром можно управлять, какое будет поведение span’а при вставке нового текста: будет ли span распространяться на текст, вставленный в начальную или конечную точки (если в середину вставить новый текст, то span автоматически применится к нему вне зависимости от значений флага).

Перечисленные выше классы различаются не только семантически, но и тем, как они устроены внутри: SpannedString и SpannableString используют массивы для хранения span’ов, а SpannableStringBuilder использует дерево интервалов.

Если провести тесты на скорость отрисовки текста в зависимости от количества span’ов, то будут такие результаты: при использовании в строке до

250 span’ов SpannableString и SpannableStringBuilder работают примерно с одинаковой скоростью, но если элементов разметки становится больше 250, то SpannableString начинает проигрывать. Таким образом, если стоит задача применить стиль к какому-то тексту, то при выборе класса надо руководствоваться семантическими требованиями: будут ли строка и стили изменяемыми. Но если для разметки требуется больше 250 span’ов, то предпочтение надо всегда отдавать SpannableStringBuilder .

Проверка на наличие span’а в тексте

Периодически возникает задача проверить, есть ли в spanned строке определенный span. И на Stackoverflow можно встретить такой код:

Такое решение будет работать, но оно неэффективно: придется пройти по всем span’ам, проверить, относится ли каждый из них к переданному типу, собрать результат в массив и в конце всего лишь проверить, что массив не пустой.

Более эффективным решением будет использование метода nextSpanTransition() :

Разметка текста в различных языковых ресурсах

Может возникнуть такая задача, когда требуется выделить при помощи разметки определенное слово в различных строковых ресурсах. Например, нам надо выделить слово “text” в английской версии и “texto” в испанской:

Если требуется что-то простое, например, выделить слово жирным, то можно использовать обычные html-теги ( ). В UI надо будет просто установить строковый ресурс в TextView:

Предположим, нам надо поменять шрифт при помощи CustomTypefaceSpan .

Добавим тег и определим для него ключ “font” и значение – тип шрифта, который мы хотим использовать – “title_emphasis”:

Вытащим строку из ресурсов, найдем аннотации с ключом “font” и расставим span’ы:

Выше упоминалось, что span’ы не из Android-фреймворка не могут имплементировать Parcelable и передаваться через Intent. Но это не относится к аннотациям, которые имплементируют Parcelable . Так что аннотированную строку можно передать через Intent и распарсить точно таким же образом, расставив свои span’ы.

Как текст располагается в TextView

TextView умеет отображать не только текст, но и картинки. Также можно задавать различные отступы перед текстом. Под капотом это работает так, что TextView создает дочерний класс Layout, ответственный непосредственно за отображение текста. Это абстрактный класс, который имеет три реализации, напрямую с ними обычно не приходится работать, если не писать свой элемент управления:

  • BoringLayout используется для простых текстов, не поддерживает переносы строк, RTL и другие вещи, но при этом является самым легковесным. TextView использует его, если текст удовлетворяет всем ограничениям.
  • StaticLayout используется в TextView для остальных случаев.
  • DynamicLayout используется для изменяемого текста в EditText.

У Layout есть много методов, которые позволяют узнать различные параметры отображаемого текста: координаты строк, baseline, координаты начала и конца текста в строке и т.д. (подробнее можно посмотреть в документации)

Такие методы могут быть очень полезны. Например, некоторые разработчики сталкиваются с задачей выделения части текста в прямоугольники с закругленными углами, и пытаются искать ее решение через span’ы, которые не применимы в решении этой проблемы.

Зато на помощь могут прийти методы класса Layout. Вот примерное решение:

При помощи аннотаций выделяем слова, которые должны быть обведены в прямоугольники.

Затем создаем 4 drawable ресурса для всех случаев переноса текста, который должен быть заключен в прямоугольники:

Далее находим нужные нам аннотации в тексте, как это описывалось выше. Теперь у нас есть индексы начала и конца такой аннотации. Через методы Layout можно узнать номер строки, на которой начинается проаннотированный текст, и на которой заканчивается:

Далее придется нарисовать один или несколько прямоугольников. Рассмотрим простой случай, когда проаннотированная часть текста оказалась на одной строке, тогда нам понадобится всего один прямоугольник с четырьмя закругленными углами. Определим его координаты и нарисуем:

Как видно из этого примера, Layout хранит очень много полезной информации по отображаемому тексту, которая может помочь в реализации разных нестандартных задач.

Производительность TextView

TextView, как и любая View, при отображении проходит через три фазы: onMeasure() , onLayout() и onDraw() . При этом onMeasure() занимает больше всего времени, в отличие от двух других методов: в этот момент пересоздается класс Layout и производится расчет размеров текста. Так что изменение размера текста (например, смена шрифта) влечет за собой много работы. Изменение же цвета текста будет более легковесным, потому что потребует только вызова onDraw() . Как упоминалось выше, в системе есть глобальный кэш слов с рассчитанными размерами. Если слово уже есть в кэше, то повторный вызов onMeasure() для него займет 11-16% от времени, которое потребовалось бы для полного расчета.

Ускорение показа текста

В 2015 году разработчики Instagram ускорили показ комментариев к фотографиям, используя глобальный кэш. Идея была в том, чтобы виртуально рисовать текст до показа его на экране, таким образом “разогрев” системный кэш. Когда подходила очередь показа текста, пользователь видел его гораздо быстрее, так как текст уже был измерен и лежал в кэше.

Начиная с Android P (28) разработчики Google добавили в API возможность выполнить фазу измерения размера текста заранее в фоновом потоке – PrecomputedText (и бэкпорт для API начиная с Android I (14) — PrecomputedTextCompat ). С использованием нового API в фоновом потоке будет выполнено 90% работы.

Показ большого текста

Если надо показать большой текст, то не стоит его сразу передавать в TextView. Иначе приложение может перестать плавно работать или вовсе начать зависать, так как будет делать много работы на главном потоке, чтобы показать огромный текст, который пользователь, возможно, даже и не прокрутит до конца. Решением будет разбиение текста на части (например, параграфы) и показ отдельных частей в RecyclerView. Для еще большего ускорения можно заранее рассчитывать размер блоков текста, используя PrecomputedText.

Для облегчения встраивания PrecomputedText в RecyclerView разработчики Google сделали специальные методы PrecomputedTextCompat.getTextFuture() и AppCompatTextView.setTextFuture() :

Так как RecyclerView во время скролла создает новые элементы, которые еще не видны пользователю, то такое решение будет иметь достаточно времени для выполнения работы в фоне до того, как элемент будет показан пользователю.

Следует помнить, что после вызова метода getTextFuture() нельзя менять стиль текста (например, поставить новый шрифт), в противном случае произойдет исключение, так как значения, с которыми вызывался getTextFuture() , не будут совпадать с теми, которые окажутся в TextView.

Что нужно знать, когда устанавливаешь текст в TextView

При вызове метода TextView.setText() на самом деле внутри создается копия строки:

То есть если установить текст со span’ами в TextView, а затем попытаться изменить переданный в setText() объект, то в отображении ничего не произойдет.

Как видно из кода, новый объект создается при помощи фабрики. В TextView имеется возможность заменить фабрику, используемую по-умолчанию, на свою реализацию. Это может быть полезно, чтобы не делать лишних копирований строк. Для этого пишем фабрику, возвращающую тот же объект, и устанавливаем ее в TextView через сеттер spannableFactory :

При установке текста надо не забывать делать вызов textView.setText(spannable, BufferType.SPANNABLE) , чтобы происходило обращение к нашей фабрике.

Разработчики Google советуют использовать это решение для отображения текста со span’ами в RecyclerView, чтобы уменьшить потребление ресурсов нашим приложением.

Если текст уже установлен в TextView, и надо добавить новый span, то совсем не нужно делать повторный вызов setText() . Надо просто взять текст из TextView и добавить в него новый span. TextView автоматически слушает spannable-строку на добавление новых span’ов, и перерисовывается:

Если же у нас есть span, который стоит в тексте у TextView, то можно обновить значения его параметров и заставить TextView перерисоваться. Если новое изменение не затрагивает размер текста, достаточно вызвать invalidate() , в противном случае – requestLayout() :

В TextView есть возможность автоматического обнаружения ссылок. Для ее включения достаточно указать в разметке атрибут autoLink . При значении autoLink=”web” TextView во время установки нового текста найдет в нем все URL через регулярное выражение и установит на найденные диапазоны символов URLSpan . Вот примерный код, как это происходит в SDK при вызове setText() :

Так как это происходит на UI потоке, то не стоит использовать autoLink=”web” внутри элементов RecyclerView. В таком случае лучше вынести определение ссылок в фоновый поток. И здесь на помощь нам приходит класс LinkifyCompat :

У autoLink еще есть возможность указать значение map – распознавание почтовых адресов (оно же будет включено при значении all ). Эту возможность лучше вообще никогда не использовать. Проблема в том, что под капотом там будет создание экземпляра WebView, через который будет осуществляться поиск адреса! В исходном коде SDK в методе Linkify.gatherMapLinks() можно увидеть такую строку, этот код выполняется на главном потоке:

А внутри WebView стоит TODO от разработчиков SDK:

Но что же тогда использовать? Решением будет новая технология Smart Linkify, к сожалению доступная только начиная с Android P (28), которая работает на основе нейронных сетей и распознает различную информацию, в том числе и почтовые адреса. Вот небольшой пример использования:

В отличие старого Linkify, распознанные адреса не будут простыми ссылками. Над адресами при нажатии будет отображаться контекстный toolbar с возможными действиями, например показ адреса на Google карте.

Технология Smart Linkify способна распознавать различные данные: номера телефонов, авиарейсы и многое другое.

Magnifier

Начиная с Android P (28), появился новый элемент управления – Magnifier, который показывает увеличенные символы при выделении текста. С его помощью пользователю гораздо проще установить курсор на нужную позицию.

По умолчанию он работает в TextView, EditText и WebView, но при желании его можно использовать при написании своих элементов пользовательского интерфейса: его API достаточно прост.

Заключение

В данной статье были опущены многие нововведения последних версий Android и смежные темы, заслуживающие отдельных статей, например:

  • работа со стилями и темами при отображении текста
  • работа со шрифтами
  • работа с классами, производными от TextView (например, EditText)

Если кому-то интересна одна из этих тем, рекомендую посмотреть презентацию с прошедшего Google I/O’19 “Best Practices for Using Text in Android”.

Источник

Читайте также:  Android введите пароль после перезагрузки
Оцените статью