@WaterSmith
Android-разработчик. Java, Kotlin

Android. Как организовать выбор стилей в приложении?

Родилась, банальная мысль: сделать в приложении возможность менять стили. Т.е. пользователь выбрал в меню, из списка "Оранжевый" - раз, и все стало в оттенках оранжевого. Выбрал "Синий" - стало синенькое. Создал несколько стилей, с разной раскраской. И возник вопрос, как организовать заполнение меню? Получилось так:
menu.add(R.id.themesMenuGroup, R.style.AppThemeBlack, 0, R.string.AppThemeBlackName);
menu.add(R.id.themesMenuGroup, R.style.AppThemeBrown, 0, R.string.AppThemeBrownName);
menu.add(R.id.themesMenuGroup, R.style.AppThemeAmber, 0, R.string.AppThemeAmberName);

// ------- еще много аналогичных строк выброшено для экономии места -----------

Но, как-то это громоздко. И родился у меня вопрос, а нельзя ли как-то иначе, в цикле, заполнить это меню со списком стилей?
  • Вопрос задан
  • 208 просмотров
Решения вопроса 2
@SofroN
Делайте массив со стилями и строками
и циклом добавляйте

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <array name="styleNames">
        <item>@string/AppThemeBlackName</item>
        <item>@string/AppThemeBrownName</item>
        <item>@string/AppThemeAmberName</item>
    </array>
<!-- можно написать так -->
    <string-array name="styleNames1">
        <item>Черный</item>
        <item>Коричневый</item>
        <item>Оранжевый</item>
    </string-array>

    <integer-array name="styleIDs">
        <item>@style/AppThemeBlack</item>
        <item>@style/AppThemeBrown</item>
        <item>@style/AppThemeAmber</item>
    </integer-array>

</resources>


Получить массив из кода
String[] names = getResources().getStringArray(R.array.styleNames);
int[] ids= getResources().getIntArray(R.array.styleIDs);


с integer массивом не уверен что так прокатит, сейчас проверить не на чем.
Но думаю направление куда копать вы поняли
Ответ написан
@WaterSmith Автор вопроса
Android-разработчик. Java, Kotlin
styleValues = new ArrayList<>();
    Field[] styleFields = R.style.class.getDeclaredFields();
    for (int i=0; i<styleFields.length; i++){
        Field styleField = styleFields[i];
        String styleName = styleField.getName();
        if (styleName.startsWith("AppTheme")){
            try {
                ContentValues styleValue = new ContentValues();
                styleValue.put("style",styleFields[i].getInt(styleName));
                styleValue.put("name",R.string.class.getField(styleName+"Name").getInt(styleName+"Name"));
                styleValues.add(styleValue);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы