Android findPreference () не работает - PullRequest
       49

Android findPreference () не работает

0 голосов
/ 18 октября 2019

У меня есть следующий макет предпочтений:

xml / preferences.xml:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:key="screen_pref">

    <!-- Populate with paid preferences -->
    <PreferenceCategory android:title="Advanced" android:key="cat_pref_mods">

    </PreferenceCategory>

    <!-- Populate with debugging preferences -->
    <PreferenceCategory android:title="Dbg." android:key="cat_pref_dbg">

    </PreferenceCategory>

</PreferenceScreen>

Первая категория (с ключом "cat_pref_mods") заполняется какожидается следующим кодом:

PreferenceCategory  mPreferenceCategory = (PreferenceCategory) findPreference("cat_pref_mods");
PreferenceScreen parentScreen = (PreferenceScreen) findPreference("screen_pref");
// Add category now
parentScreen.addPreference(mPreferenceCategory);

Однако при заполнении второй категории аналогичным образом:

PreferenceCategory  mPreferenceCategory = (PreferenceCategory) findPreference("cat_pref_dbg");
PreferenceScreen parentScreen = (PreferenceScreen) findPreference("screen_pref");
// Add category now
parentScreen.addPreference(mPreferenceCategory);

Два заголовка категории, определенные в файле preferences.xml, появляются сразу один под другим ивпоследствии фактические настройки объединяются.

Почему категория с ключом "cat_pref_mods" вместе с ее записями не отображается полностью перед категорией "cat_pref_dbg"?

При отладке родительский экран кажется пустым(""), даже если он был предварительно инициализирован:

addPreferencesFromResource(R.xml.preferences);

Если создана только одна категория, элементы отображаются в ожидаемом порядке. При создании двух заголовки категорий размещаются сразу один под другим, но впоследствии записи появляются, как и ожидалось.

1 Ответ

0 голосов
/ 19 октября 2019

Оказывается, что категории, а также предпочтения должны добавляться последовательно (программно, как объекты), что-то вроде:

private void addPreferences() {
    addPreferencesFromResource(R.xml.preferences);

    PreferenceScreen parentScreen = (PreferenceScreen) findPreference(KEY_PREF_SCREEN);

    PreferenceCategory catOne= new PreferenceCategory(this);
    catOne.setTitle("Cat. #1");
    parentScreen.addPreference(catOne);

    addPreferencesFromResource(R.xml.preference_one);

    PreferenceCategory catTwo = new PreferenceCategory(this);
    catTwo .setTitle("Cat. #2");
    parentScreen.addPreference(catTwo);

    addPreferencesFromResource(R.xml.preference_two);
}
...