2011-03-06 25 views
7

在我的应用我有嵌套PreferencesScreen的如何导航到嵌套PreferencesScreen

<PreferencesScreen> 
    <PreferencesScreen android:key="application"> 

    </PreferencesScreen> 
</PreferencesScreen> 

现在我想火Intent把我从currrent Activity直接向应用程序首选项子屏幕。我怎样才能做到这一点?

回答

3

我使用的方法是将嵌套的PreferenceScreen放入一个单独的XML文件并在其他PreferenceActivity中使用它。在这种情况下,您可以使用Preference.setIntent()从首选项导航到此屏幕,并以另一种Activity的常用方式启动此Activity

6

在我的应用程序中,我有类似的任务以编程方式显示第二级PreferencesScreen。我所做的:

  1. preferences.xml我分配了一个关键PreferencesScreen我要显示(如图中的问题)。

  2. 要显示PreferencesScreen我写道:

    final Intent preferencesActivity = new Intent(getBaseContext(), MyPreferencesActivity.class); 
    preferencesActivity.putExtra("PREFERENCE_SCREEN_KEY", "key_of_preference_screen_to_show"); 
    startActivity(preferencesActivity); 
    
  3. 在方法我PreferenceActivity类onCreate加入以下代码

    然后:

    final Intent intent = getIntent(); 
    final String startScreen = intent.getStringExtra("PREFERENCE_SCREEN_KEY"); 
    if (startScreen != null) { 
        getIntent().removeExtra("PREFERENCE_SCREEN_KEY"); 
        final Preference preference = findPreference(startScreen); 
        final PreferenceScreen preferenceScreen = getPreferenceScreen(); 
        final ListAdapter listAdapter = preferenceScreen.getRootAdapter(); 
        final int itemsCount = listAdapter.getCount(); 
        int itemNumber; 
        for (itemNumber = 0; itemNumber < itemsCount; ++itemNumber) { 
         if (listAdapter.getItem(itemNumber).equals(preference)) { 
          preferenceScreen.onItemClick(null, null, itemNumber, 0); 
          break; 
         } 
        } 
    } 
    

一个此言......不仅第二级PreferencesScreen,但整个偏好层次结构在这里加载。所以,如果按Back按钮,将出现第一个(父)PreferencesScreen。在我的情况下,这正是我需要的。不确定你的。

4

这里是通过抓住子画面前面处理问题的方式:

public class MyChildPreferenceActivity extends PreferenceActivity { 

    private String screenKey = "myChildScreenKey"; 

    @Override 
    public PreferenceScreen getPreferenceScreen() { 
     PreferenceScreen root = super.getPreferenceScreen(); 
     if (root != null) { 
      PreferenceScreen match = findByKey(root, screenKey); 
      if (match != null) { 
       return match; 
      } else { 
       throw new RuntimeException("key " + screenKey + " not found"); 
      } 
     } else { 
      return null; 
     } 
    } 

    private PreferenceScreen findByKey(PreferenceScreen parent, String key) { 
     if (key.equals(parent.getKey())) { 
      return parent; 
     } else { 
      for (int i = 0; i < parent.getPreferenceCount(); i++) { 
       Preference child = parent.getPreference(i); 
       if (child instanceof PreferenceScreen) { 
        PreferenceScreen match = findByKey((PreferenceScreen) child, key); 
        if (match != null) { 
         return match; 
        } 
       } 
      } 
      return null; 
     } 
    } 

    // ... 
4

我解决您的确切同样的问题,这条路。

在您的喜好活动:

@Override 
protected void onResume() { 
    super.onResume();  

    int startingPage = getIntent().getIntExtra(Constants.PREFS_STARTING_PAGE, 0); 

    switch (startingPage) { 
     case Constants.MY_PREF_SCREEN_1: 
      setPreferenceScreen((PreferenceScreen)findPreference(getString(R.string.PREF_SCREEN_1))); 
      break; 
     case Constants.MY_PREF_SCREEN_2: 
      setPreferenceScreen((PreferenceScreen)findPreference(getString(R.string.PREF_SCREEN_2))); 
      break; 
     default: 
      // Nothing to do, but read the warning below. 
    } 
} 

然后你就可以打开内偏好屏幕是这样的:

Intent prefIntent = new Intent(ctx, MyPreferenceActivity.class); 
    prefIntent.putExtra(Constants.PREFS_STARTING_PAGE, Constants.MY_PREF_SCREEN_1); 
    startActivity(prefIntent); 

要注意的是这个工程只要活动情况是不同的:一个实例为主要首选项屏幕,另一个为内部屏幕。通过这种方式,当您在没有“启动”参数的情况下启动活动时,您总是会进入默认开关状态,并且永远不需要设置主要首选项屏幕。这里的问题是,如果您首先运行以内部前导屏幕开始的活动,然后发出SAME活动(例如,使用标志singleInstance)询问一般(根)前导屏幕,则无法调用findPreference ()从子喜好屏幕中查找根偏好屏幕。

那么,希望没有太多混淆;-)