Android findPreference() 损坏

Android findPreference() broken

我有以下偏好布局:

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中定义的两个类别headers,立即出现一个 在彼此之下,然后将实际偏好连接起来。

为什么键为 "cat_pref_mods" 的类别及其条目不显示 完全在类别 "cat_pref_dbg"?

之前

调试时 parent 屏幕似乎是空的 (""),即使之前已初始化:

addPreferencesFromResource(R.xml.preferences);

如果只创建了一个类别,项目将按预期显示。创建两个时,类别 headers 紧挨着一个放在另一个下面,但条目之后会按预期显示。

事实证明,类别和首选项必须按顺序添加(以编程方式,作为对象),大致如下:

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);
}