2011-03-06 14 views
7

nella mia app ho annidati di PreferencesScreenCome navigare a annidato PreferencesScreen

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

    </PreferencesScreen> 
</PreferencesScreen> 

Ora voglio sparare Intent di portarmi da currrent Activity direttamente a preferenze dell'applicazione sottoschermo. Come posso fare questo?

risposta

3

Il modo in cui utilizzo consiste nel mettere nidificato PreferenceScreen in un file XML separato e utilizzarlo in altri PreferenceActivity. In questo caso sarai in grado di navigare verso questa schermata dalle preferenze usando Preference.setIntent() e avviare questo Activity in un modo usuale da un altro Activity.

6

Nella mia applicazione ho il compito simile di mostrare il secondo livello PreferencesScreen a livello di programmazione. Quello che ho fatto:

  1. In preferences.xml ho assegnato una chiave per PreferencesScreen Voglio mostrare (come mostrato in questione).

  2. Per mostrare PreferencesScreen ho scritto:

    final Intent preferencesActivity = new Intent(getBaseContext(), MyPreferencesActivity.class); 
    preferencesActivity.putExtra("PREFERENCE_SCREEN_KEY", "key_of_preference_screen_to_show"); 
    startActivity(preferencesActivity); 
    
  3. Poi nella mia classe PreferenceActivity nel metodo onCreate è stato aggiunto il seguente codice:

    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; 
         } 
        } 
    } 
    

Una nota ... Non solo secondo livello PreferencesScreen, ma l'intera gerarchia delle preferenze è stata caricata qui. Quindi, se premi il tasto Back, apparirà il primo (genitore) PreferencesScreen. Nel mio caso era esattamente ciò di cui avevo bisogno. Non sono sicuro del tuo.

4

Ecco un modo di affrontare il problema afferrando il bambino a schermo sulla parte anteriore:

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

ho risolto il problema esattamente lo stesso in questo modo.

Nella vostra attività preferenza:

@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. 
    } 
} 

Quindi è possibile aprire la schermata delle preferenze interno con qualcosa di simile:

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

Attenzione che questo funziona fino a quando le istanze di attività sono diverse: uno istanza per la schermata delle preferenze principali e un'altra per la schermata interna. In questo modo, quando si avvia l'attività senza parametro "avvia", si cade sempre nel caso di scambio predefinito e non è mai necessario impostare la schermata di preferenza principale. Il problema qui è che se prima esegui l'attività iniziando con una schermata di pref interno e poi lanciando l'attività SAME (con il flag singleInstance, ad esempio) chiedendo la schermata di pref generale (root), non sei in grado di chiamare findPreference() per trovare la schermata delle preferenze root all'interno di una schermata delle preferenze figlio.

Bene, spero di non aver fatto troppa confusione ;-)