Как помещать контент в ListPreference с Java в Android?

В layout pref_general.xml у меня есть один ListPreference чтобы выбирать язык App.


Но я хочу, что entries и entryValuesони должны населяться с полученного array getAppLanguages() определенная в: Как получать список языков, которые определены в App в Android?

Функция возвращает данные с этой структурой:

Map

Нуждался в том, чтобы заселить динамику - разум один ListPreference а именно с кода Java. Отделять map по частям value для entries и key для entryValues

1
задан 13.04.2017, 16:00
2 ответа

Решенный! Чтобы создавать ListPrefrence dinámicamente, начиная с одного Map<key,value>

layout.xml

<ListPreference
    android:key="language"
    android:defaultValue="default"
    android:dialogTitle="@string/pref_title_dialog_sel_language"
    android:negativeButtonText="@null"
    android:positiveButtonText="@null"
    android:title="@string/pref_title_sel_language" />

Внутри метода OnCreate

        final ListPreference listPreference = (ListPreference) findPreference("language");
        setListPreferenceData(listPreference);

функция setListPreferenceData

private static void setListPreferenceData(ListPreference lp) {
    Map<String,String> listSupportLanguages = Utils.getAppLanguages(MyApplication.getAppContext(),"en");

    List<String> listValues = new ArrayList<>();
    for (String key: listSupportLanguages.keySet()) {
        listValues.add(listSupportLanguages.get(key));
    }

    CharSequence[] entries = listValues.toArray(new CharSequence[listValues.size()]);
    CharSequence[] entryValues = listSupportLanguages.keySet().toArray(new CharSequence[listSupportLanguages.size()]);

    lp.setEntries(entries);
    lp.setEntryValues(entryValues);
    lp.setDefaultValue("default");
}

Referéncias:

Как получать список языков, которые определены в App в Android?

Как получать context внутри метода static в Android?

Альтернативный метод

Другая форма, чтобы создавать селектор языков, который завершал бы меньше ресурсов, состоит в том, чтобы перемещать array языков, который выносит App, только необходимо определять код ISO 639-1

<string-array name="pref_language_list_values">
    <item>default</item>
    <item>es</item>
    <item>en</item>
    <item>it</item>
</string-array>

Функция getAppSupportedLaungages

public static String[] getAppSupportedLaungages(Context context, String[] langs) {

    Configuration conf = context.getResources().getConfiguration();

    String[] displayNames = new String[langs.length];
    displayNames[0] = "Auto";
    int size = langs.length;
    for (int i=1; i < size; i++) {
        conf.locale = new Locale(langs[i]);
        displayNames[i] = ucFirst(conf.locale.getDisplayName());
    }

    return displayNames;
}

public static String ucFirst(String subject) {
    if (!subject.isEmpty()) {
        return Character.toUpperCase(subject.charAt(0)) + subject.substring(1);
    } else {
        return null;
    }

}

функция setListPreferenceData

private static void setListPreferenceData(ListPreference lp) {

    String[] entryValues = MyApplication.getAppContext().getResources().getStringArray(R.array.pref_language_list_values);
    CharSequence[] entries = Utils.getAppSupportedLaungages(MyApplication.getAppContext(), entryValues);

    lp.setEntries(entries);
    lp.setEntryValues(entryValues);
    lp.setDefaultValue("default");
}
0
ответ дан 24.11.2019, 14:21

Самое простое с моей точки серьезного зрения, создавать Переключатель и наполнять dinamicamente entries и оцени на основании полученной стоимости.

 CharSequence[] entries;
 CharSequence[] entryvalues;
        switch (language){
            case "italian":
                entries = getResources().getStringArray(R.array.italian_entries);
                entryvalues = getResources().getStringArray(R.array.italian_entry_values);
            case "spanish":
                entries = getResources().getStringArray(R.array.spanish_entries);
                entryvalues = getResources().getStringArray(R.array.spanish_entry_values);
            case "english":
                entries = getResources().getStringArray(R.array.english_entries);
                entryvalues = getResources().getStringArray(R.array.english_entry_values);

        }
 myListPreference.setEntries(entries);
 myListPreference.setDefaultValue("1");
 myListPreference.setEntryValues(entryValues);

В случае, если он возвратит тебе очень пространный array стоимости, ты мог бы признавать себя array в xml с языком, и array entries и оцени корреспондент для каждого, и на основании этого, призывать реализовывать то же самое, что в примере наверху, но не создавая гигантского Переключателя.

Я надеюсь, что он ты помогает!

Приветствие

1
ответ дан 24.11.2019, 14:21
  • 1
    Спасибо, мысль получать их с funci и # 243; n getAppLanguages - это, чтобы не быть должным создавать array XML entries и оцени, который, если присоединяется один, ты оценил - ru, он ничего не был должен менять, так как разорять это, и # 237; в autom и # 225; ticamente. Уедь t и # 250; c и # 243; я говорю, что он подает меня, – Webserveis 18.05.2016, 11:10
  • 2
    Если функция getAppLanguages возвращает тебе один и #250; nico array из-за языка, из-за которого ты не используешь этот array, чтобы наполнять EntryValues и используешь характерный один для entries? – Francisco Durdin Garcia 18.05.2016, 11:15
  • 3
    я должен отделять array (key, я оценил) keys, что быть и # 225; n entryvalues и оцените entries, с твоей конечной частью dir и # 237; в который уже я это оплачиваю, – Webserveis 18.05.2016, 11:32
  • 4
    Гениальный;) Помни что пометь ответ как правильная, если он ты помог! – Francisco Durdin Garcia 18.05.2016, 12:16
  • 5
    Франсиско уже ты +1 в твоем ответе – Webserveis 18.05.2016, 13:50

Теги

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