嵌套的preferences.xml

时间:2011-03-15 16:11:37

标签: android include nested preferences android-preferences

是否有可能将一个preferences.xml包含在另一个中,就像使用<include />标记的布局一样?

让我们说:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceScreen 
        android:title="@string/pref_group_title_visual">
        <include 
            preferences_filename="xml/pref_visual"/>
    </PreferenceScreen>
...

4 个答案:

答案 0 :(得分:25)

这里的解决方案是从PreferencesActivity中扩充两个首选项文件。例如:

    addPreferencesFromResource(R.xml.options);
    addPreferencesFromResource(R.xml.additional_options);

答案 1 :(得分:14)

灵魂解决方案展示了作品。如果您是使用未签名版本的应用程序的开发人员,则可以将其展开为仅显示首选项;)

addPreferencesFromResource(R.xml.options);
addPreferencesFromResource(R.xml.additional_options);
if (BuildConfig.DEBUG) {
    addPreferencesFromResource(R.xml.developer_options);
}

我创建了一篇关于此问题的博客文章,并提供了可供下载的完整工作代码示例。 http://androidfu.blogspot.com/2012/05/developer-debug-with-nested-preferences.html

答案 2 :(得分:3)

要真正实现嵌套效果,您可以使用此技术将已加载的首选项重定位到已加载的组。

PreferenceCategory notifications = (PreferenceCategory) getPreferenceScreen ().findPreference (PreferenceKey.pref_notifications.name ());
addPreferencesFromResource (R.xml.pref_notifications, notifications);

增强的addPreferencesFromResource定义为:

private void addPreferencesFromResource (int id, PreferenceGroup newParent) {
    PreferenceScreen screen = getPreferenceScreen ();
    int last = screen.getPreferenceCount ();
    addPreferencesFromResource (id);
    while (screen.getPreferenceCount () > last) {
        Preference p = screen.getPreference (last);
        screen.removePreference (p); // decreases the preference count
        newParent.addPreference (p);
    }
}

适用于任何PreferenceGroup,例如PreferenceScreen和PreferenceCategory。

答案 3 :(得分:2)

不,这似乎是不可能的。但是有一个简单的解决方法。您可以创建另一个加载嵌套PreferenceActivity的{​​{1}}。在主要的preference.xml文件中,您需要创建一个PreferenceScreen对象,并在代码中为其设置Preference对象(使用Intent方法)。必须使用此setIntent()来创建第二个Intent