Android - Общие настройки гарнитуры

Для начала у меня есть приложение с двумя видами деятельности. 1-й - основной. На втором есть 3 флажка, которые меняют шрифт текстового представления в основном действии (полужирный, курсив и подчеркивание). Что я хочу сделать, так это после закрытия и повторного открытия приложения в текстовом представлении будет выбран ранее выбранный шрифт. Есть ли способ сохранить шрифт в общих настройках или это можно сделать другим способом?

Спасибо

ОБНОВИТЬ

Это работает (третий подход снизу, ответ)

    boolean loadCheck1 = preferences.getBoolean("checked1", false);
    if (loadCheck1) {
            tx.setTypeface(tx.getTypeface(), Typeface.BOLD);
    } else {
        tx.setTypeface(null, Typeface.NORMAL);
    }

    boolean loadCheck2 = preferences.getBoolean("checked2", false);
    if (loadCheck2) {
        tx.setTypeface(tx.getTypeface(), Typeface.ITALIC);
    } else {
        tx.setTypeface(null, Typeface.NORMAL);
    }

    boolean loadCheck3 = preferences.getBoolean("checked3", false);
    if (loadCheck3){
        tx.setPaintFlags(tx.getPaintFlags()| Paint.UNDERLINE_TEXT_FLAG);
    } else {
    tx.setPaintFlags(tx.getPaintFlags() & (~Paint.UNDERLINE_TEXT_FLAG));
    }

Но есть проблема с полужирным шрифтом. Даже если установлен флажок 1, жирный шрифт не отображается. Это действительно странно, ведь все If сделаны одинаково. Кроме того, если я изменю порядок (например, loadcheck2, loadcheck3, loadcheck1), курсив не будет отображаться.

1
0
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Вы можете использовать библиотеку GSON для хранения класса Object (Typeface расширяет Object) в SharedPrefereces. Подробнее об этом подходе: Как Android SharedPreferences сохраняет / сохраняет объект

  • Если вы не хотите использовать какие-либо внешние библиотеки, вы можете создать класс enum или interface с переменными, которые будут представлять конкретный Typeface, который вы хотите сохранить, и сохранить эту переменную в SharedPreferences. Когда пользователь повторно открывает приложение, просто извлеките эту переменную и используйте инструкцию switch, чтобы определить, какой Typeface использовать.

  • Сохраните значение в SharedPreferences, которое представляет, какой CheckBox выбран перед уничтожением Actvity. Затем при запуске Activity найдите это значение и проверьте, какой из CheckBoxбыл выбран, затем выберите соответствующий Typeface.


I would recommend using второй or в третьих approach, because storing Typeface in SharedPreferences might bring some performance drawbacks compared to other approaches.

Большой! Большое спасибо! Но у меня другая проблема. Просмотрите обновленный вопрос.

Karol 05.04.2018 14:36

Я рад, что это сработало. Я бы посоветовал вам добавить несколько точек останова и отладить код.

Tomas Jablonskis 05.04.2018 14:44

Кстати, ваша цель - использовать несколько шрифтов друг на друге, например: Полужирный + Курсив / Полужирный + Подчеркнутый / Полужирный + Курсив + Подчеркнутый? Или всего один? Потому что на данный момент, если выполняются первые 2 условия, второй if будет иметь приоритет над первым if.

Tomas Jablonskis 05.04.2018 14:48

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

Karol 05.04.2018 14:51

Затем, как я упоминал выше, если условное обозначение жирным шрифтом и условное обозначение курсивом являются true, тогда второе условное обозначение всегда будет иметь приоритет над первым. Просто используйте это во втором if: tx.setTypeface(null, Typeface.ITALIC | Typeface.BOLD);

Tomas Jablonskis 05.04.2018 14:54

Но теперь, когда вы выбираете только checkBox Italic, тогда также будет активирован Bold

Karol 05.04.2018 14:58

Что ж, это логично. Виноват. В этом случае попробуйте добавить еще одно условие между курсивом и отменой выделения: if (loadCheck1 && loadCheck2) { tx.setTypeface(null, Typeface.BOLD_ITALIC); } и отмените мое предыдущее предложение.

Tomas Jablonskis 05.04.2018 15:03

Хорошо, спасибо, что сработало. 3 дополнительных if были необходимы: if (loadCheck1 && loadCheck2) { tx.setTypeface(tx.getTypeface(), Typeface.BOLD_ITALIC); } else if (loadCheck1 && !loadCheck2) { tx.setTypeface(tx.getTypeface(), Typeface.BOLD); } else if (!loadCheck1 && loadCheck2) { tx.setTypeface(tx.getTypeface(), Typeface.ITALIC); }

Karol 05.04.2018 15:13

Другие вопросы по теме