2011-10-06 70 views
0

我在API級別9工作,因此無法使用新的首選片段內容。如何在部分層次結構中啓動preferenceActivity部分

我有一個首選項活動從api演示獲取偏好和xml文件。我有一個偏好屏幕的層次結構,因此非常適合您的偏好,您必須點擊頂層屏幕。

除了從我的主菜單中獲取所有偏好設置,我希望能夠在子屏幕之一而不是頂部屏幕上啓動偏好活動,因此我可以直接在其中一個子屏幕中啓動它在一組活動中說一個點擊,這組子選項是重要的。

任何人都知道這是可行的嗎?我會認爲,傳遞一些數據的意圖是方式,但我找不到任何可能的事情。

回答

1

好的,這裏是我結束與庫蒂斯的幫助。

基本上在我的代碼開始首選項活動我沒有任何行動的所有喜好和行動,如果你只想要他們中的一些。該動作需要匹配某種偏好或偏好集合上的鍵。

// all preferences 
Intent launchPreferencesIntent = new Intent().setClass(this, 
    PreferencesFromXml.class); 
startActivity(launchPreferencesIntent); 

// just key_trip_plot_control_preferences 
Intent launchPreferencesIntent = new Intent(
    getString(R.string.key_trip_plot_control_preferences)) 
    .setClass(this, PreferencesFromXml.class); 
startActivity(launchPreferencesIntent); 

在我PreferencesFromXml類,我總是從XML添加偏好,但這時如果我有一個動作我搜索雖然喜好尋找匹配的密鑰。如果我找到一個我removeAll首選項,然後添加匹配的或它的孩子,如果它是一個PreferenceGroupe回來。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.preferences); 
    String act = getIntent().getAction(); 

    if (act != null) { 
     Preference res = findPreferenceByKey(getPreferenceScreen(), act); 
     if (res != null) { 
      getPreferenceScreen().removeAll(); 
      if (res instanceof PreferenceGroup) { 
       PreferenceGroup groupe = (PreferenceGroup) res; 
       // add sub items 
       for (int i = 0; i < groupe.getPreferenceCount(); i++) { 
        Preference pref = groupe.getPreference(i); 
        if (pref != null) { 
         getPreferenceScreen().addPreference(pref); 
        } 
       } 
      } else { // just add the item. 
       getPreferenceScreen().addPreference(res); 
      } 
     } 
    } 
} 

protected Preference findPreferenceByKey(PreferenceGroup in, String key) { 
    for (int i = 0; i < in.getPreferenceCount(); i++) { 
     Preference pref = in.getPreference(i); 
     if (pref == null) { 
      // should not happen 
      Log.v(TAG, "findPreferenceByKey null pref i:" + i); 
      return null; 
     } else if (pref.hasKey() && pref.getKey().equals(key)) { 
      return pref; 
     } else if (pref instanceof PreferenceGroup) { 
      // recurse 
      Preference res = findPreferenceByKey((PreferenceGroup) pref, 
        key); 
      if (res != null) { 
       return res; 
      } 
     } 
    } 
    return null; 
} 
0

首先,偏好片段提供給您通過Android兼容包:http://developer.android.com/sdk/compatibility-library.html

其次,是的,這是可能的。當你創建你的片段或acitvity(你決定),使用addPreferencesFromIntent()方法(http://developer.android.com/reference/android/preference/PreferenceFragment.html#addPreferencesFromIntent%28android.content.Intent%29),而不是添加整個屏幕只需添加你想要的子屏幕。

+0

好吧,它是有保證,這是可能的。您還讓我在我沒有看過的文檔中找到一個新的API,因爲它是API級別11,我正在過濾它。不幸的是,關於addPreferencesFromIntent()的段落就像泥土一樣清晰。一些更多的人發現一些人試圖做我想做的事,但沒有明確的例子。我的curent嘗試在preferencemanager.inflateFromIntent中給出了一個空指針異常,所以我的Intent可能不好。 – Ifor

+0

好吧,因此addPreferencesFromIntent可能不會完全符合您的要求。根據文檔,您應該通過在意圖中設置明確的活動來使用它。然後將查詢活動元數據,並假定元數據將具有偏好。你可以做的一件事就是將子選項屏幕與特定的活動關聯起來。更好的選擇可能是將自己的數據包含在意圖中,自己解析數據,然後執行addPreferencesByResource(),資源依賴於傳遞的數據。 –

+0

好的我得到了AddPreferencesFromIntent來執行,我的元數據位於我的清單中的錯誤位置。我現在得到的第一個屏幕,但點擊一個子屏幕上我得到錯誤/ AndroidRuntime(2408):android.view.WindowManager $ BadTokenException:無法添加窗口 - 標記null不適用於我看到別人報告的應用程序。我通過複製我感興趣的子級別的xml文件併爲其創建新的活動來解決此問題。如果我可以將一個包含在xml中,那麼這將是確定的,但是這需要在首選項xml中爲我工作。 – Ifor