2011-10-06 58 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