2011-03-06 62 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 ()從子喜好屏幕中查找根偏好屏幕。

那麼,希望沒有太多混淆;-)