2011-03-15 63 views
31

是否有可能包含一個preferences.xml到另一個,就像它可以完成與<include />標籤的佈局?嵌套preferences.xml

比方說:

<?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> 
... 

回答

2

不,這似乎是不可能的。但是有一個簡單的解決方法。您可以製作另一個加載嵌套的PreferenceActivityPreferenceScreen。在主preference.xml文件中,您需要創建一個對象Preference,並在代碼中使用設置對象爲Intent(使用setIntent()方法)。必須使用此Intent來創建第二個PreferenceActivity

21

這裏的解決方案是從PreferencesActivity中爲這兩個偏好文件充氣。例如:

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

事實上,這確實有效。完美。我在下面添加了一小段代碼片段,增加了開發人員顯示首選項的功能,這些首選項僅適用於推送到電話/仿真器的未簽名應用程序:) –

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

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。