Комментарии 22
А чем не угодило изменение поля Configuration.fontScale для всего приложения, без использования вороха кастомных вьюх?
Configuration.fontScale зависит от настроек всего телефона. Если в них пользователь изменил размер шрифта, то тогда и в приложении изменится размер. Такой способ мне не подошёл, т.к. не всегда пользователь меняет размер во всем телефоне, а хочет его изменить только в конкретном приложении.
Так меняйте конфигурацию ресурсов для своего приложения. Примеров в всети куча.
Если вам не сложно, то не могли бы вы скинуть ссылку на пример? Я пока ничего подходящего не смог найти. И тем более ресурсы же нельзя менять, они встраиваются в приложение в момент компиляции (это на сколько я знаю)
Я, например, таким образом локаль в приложении менял:
Хотя сейчас погуглил, оказывается если targetApiLevel > 17, то могут быть разные вариации. Можно почитать тут.
Resources resources = getApplicationContext().getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = new Locale(lang);
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
Хотя сейчас погуглил, оказывается если targetApiLevel > 17, то могут быть разные вариации. Можно почитать тут.
По-моему так себе способ. Это же нужно каждую вьюху переопределять. Самый простой способ, который приходит в голову это переопределить фактори для инфлейтера и реализовать там всю логику, тогда шрифт будет везде изменяться и никаких кастомных вьюх не нужно.
Спасибо за идею, попробую с таким способом сделаю
Еще можно попробовать через темы сделать, но для этого, наверное, для каждого размера шрифта в теме атрибут нужно будет создать.
Использовали на проекте эту либу github.com/chrisjenx/Calligraphy
Если не ошибаюсь, в ней так и сделано.
Если не ошибаюсь, в ней так и сделано.
Спасибо за идею, попробую с таким способом сделаю
- От слова «Динамическое» в этом решении нет абсолютно ничего. После инициализации приложения происходит единственный вызов onCreate в Application и вы инициализируете константу. То есть для применения размера шрифта вы храните постоянную переменную. Обновление SharedPreferences в Realtime не приведет ни к каким «Динамическим» изменениям
- Шрифты используются во всех наследниках TextView. Решать данную задачу через наследование — есть крайне грубая ошибка. Вы будите вынуждены писать аналогичные классы ко всем наследникам TextView (Button, Checkbox and etc)
Да, это решение более оптимально, чем предыдущее. Но отсутсвует «Динамическое», так как вам необходимо пересоздавать View для применения конфигурации. к
Было бы интересно посмотреть такую реализацию, начал делать сперва по примеру, но споткнулся на создании класса для MySpinner +) Там не срабатывает установка размеров такая
Хорошо, подготовлю пример реализации
Обновил статью, добавил в конце новую реализацию.
спасибо дорогой друг =) завтра буду пробовать присобачить, сегодня пол дня провозился с подстройкой под твою первую реализацию, и даже почти все кроме спинера под нее перевел, погляжу как вторая будет работать
Вторая реализация нормально меняет размер у спинера. Только что проверил в своём приложении.
Все сработало, спасибо, с изменением размеров шрифтов бился уже давно, и нормального мануала на эту тему не получалось найти, большой тебе респект!
P.S. не знаю уж почему, у меня res. не сработало, заменил на getResources().
P.S. не знаю уж почему, у меня res. не сработало, заменил на getResources().
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Динамическое изменение размера шрифта во всем приложении на Android с помощью Configuration.fontScale