Как стать автором
Обновить

Комментарии 22

А чем не угодило изменение поля Configuration.fontScale для всего приложения, без использования вороха кастомных вьюх?
Configuration.fontScale зависит от настроек всего телефона. Если в них пользователь изменил размер шрифта, то тогда и в приложении изменится размер. Такой способ мне не подошёл, т.к. не всегда пользователь меняет размер во всем телефоне, а хочет его изменить только в конкретном приложении.
Так меняйте конфигурацию ресурсов для своего приложения. Примеров в всети куча.
Если вам не сложно, то не могли бы вы скинуть ссылку на пример? Я пока ничего подходящего не смог найти. И тем более ресурсы же нельзя менять, они встраиваются в приложение в момент компиляции (это на сколько я знаю)
Я, например, таким образом локаль в приложении менял:
Resources resources = getApplicationContext().getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = new Locale(lang);
resources.updateConfiguration(configuration, resources.getDisplayMetrics());

Хотя сейчас погуглил, оказывается если targetApiLevel > 17, то могут быть разные вариации. Можно почитать тут.
Пожалуй вы правы, таким образом можно обойтись без кастомных View и application. Большое спасибо вам за подсказку.
По-моему так себе способ. Это же нужно каждую вьюху переопределять. Самый простой способ, который приходит в голову это переопределить фактори для инфлейтера и реализовать там всю логику, тогда шрифт будет везде изменяться и никаких кастомных вьюх не нужно.
Спасибо за идею, попробую с таким способом сделаю
Еще можно попробовать через темы сделать, но для этого, наверное, для каждого размера шрифта в теме атрибут нужно будет создать.
Вариант с темами я сразу исключил для себя, т.к. не хотелось делать несколько тем и потом их связывать с конкретной величиной размера шрифта. Хотелось сделать именно функционал, чтобы пользователь могу выбрать размер не из выпадающего списка, грубо говоря, а двигая ползунок.
Использовали на проекте эту либу github.com/chrisjenx/Calligraphy

Если не ошибаюсь, в ней так и сделано.
Спасибо за идею, попробую с таким способом сделаю
  • От слова «Динамическое» в этом решении нет абсолютно ничего. После инициализации приложения происходит единственный вызов onCreate в Application и вы инициализируете константу. То есть для применения размера шрифта вы храните постоянную переменную. Обновление SharedPreferences в Realtime не приведет ни к каким «Динамическим» изменениям
  • Шрифты используются во всех наследниках TextView. Решать данную задачу через наследование — есть крайне грубая ошибка. Вы будите вынуждены писать аналогичные классы ко всем наследникам TextView (Button, Checkbox and etc)
Согласен с Вами, что писать свой класс под каждый наследник — глупо. Почитав комментарии, решил переделать свою реализацию на использование Configuration.fontScale, как подсказал Ganster41. По необходимости могу показать пример реализации.
Да, это решение более оптимально, чем предыдущее. Но отсутсвует «Динамическое», так как вам необходимо пересоздавать View для применения конфигурации. к
Было бы интересно посмотреть такую реализацию, начал делать сперва по примеру, но споткнулся на создании класса для MySpinner +) Там не срабатывает установка размеров такая
Хорошо, подготовлю пример реализации
Обновил статью, добавил в конце новую реализацию.
спасибо дорогой друг =) завтра буду пробовать присобачить, сегодня пол дня провозился с подстройкой под твою первую реализацию, и даже почти все кроме спинера под нее перевел, погляжу как вторая будет работать
Вторая реализация нормально меняет размер у спинера. Только что проверил в своём приложении.
Все сработало, спасибо, с изменением размеров шрифтов бился уже давно, и нормального мануала на эту тему не получалось найти, большой тебе респект!
P.S. не знаю уж почему, у меня res. не сработало, заменил на getResources().
Моя невнимательность. Забыл добавить объявление переменной: Resources res = getResources().
Подправил описание.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации