嵌套的preferences.xml

34

是否可以以某种方式将一个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个回答

27

解决方法是从PreferencesActivity中膨胀(inflate)两个偏好文件。例如:

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

这确实有效。完美无缺。我在下面添加了一小段代码片段,使开发人员能够显示仅适用于推送到手机/模拟器的未签名应用程序的首选项 :) - Bill Mote

17

这个解决方案非常实用。如果你是使用未签名版本的应用程序开发者,它还可以扩展为仅显示首选项 ;)

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


4
为了真正实现嵌套效果,您可以使用此技术将加载的首选项重新定位到已加载的组中。
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。


2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接