2011-03-06 13 views
7

en mi aplicación que he anidado de PreferencesScreencómo navegar a PreferencesScreen anidado

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

    </PreferencesScreen> 
</PreferencesScreen> 

Ahora quiero disparar Intent que me llevara a currrent Activity directamente a preferencias de la aplicación subpantalla. ¿Cómo puedo hacer esto?

Respuesta

3

La forma en que uso es poner anidado PreferenceScreen en un archivo XML separado y usarlo en el otro PreferenceActivity. En este caso, podrá navegar a esta pantalla desde las preferencias usando Preference.setIntent() e iniciar este Activity de forma habitual desde otro Activity.

6

En mi aplicación tengo la tarea similar de mostrar el segundo nivel PreferencesScreen mediante programación. Lo que hice:

  1. En preferences.xml me asignó una clave para PreferencesScreen quiero mostrar (como se muestra en la pregunta).

  2. Para mostrar PreferencesScreen escribí:

    final Intent preferencesActivity = new Intent(getBaseContext(), MyPreferencesActivity.class); 
    preferencesActivity.putExtra("PREFERENCE_SCREEN_KEY", "key_of_preference_screen_to_show"); 
    startActivity(preferencesActivity); 
    
  3. Luego, en mi clase PreferenceActivity en el método onCreate se añadió el siguiente código:

    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 observación ... No sólo segundo nivel PreferencesScreen, pero toda la jerarquía de preferencias se cargó aquí. Por lo tanto, si presiona el botón Back, aparecerá el primer (principal) PreferencesScreen. En mi caso, eso era exactamente lo que necesitaba. No estoy seguro del tuyo

4

Aquí es una manera de manejar el problema por el acaparamiento de la pantalla secundaria en la delantera:

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

que resolvió su problema exactamente el mismo de esta manera.

En su actividad de preferencia:

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

entonces usted puede abrir la pantalla de preferencias interior con algo como esto:

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

Mira que esto funciona siempre y cuando las instancias de actividad son diferentes: uno instancia para la pantalla de preferencias principal y otra para la pantalla interna. De esta forma, cuando comienzas la actividad sin el parámetro "inicio", siempre caes en la caja del interruptor por defecto y nunca necesitas configurar la pantalla de preferencias principal. El problema aquí es que si primero ejecuta la actividad comenzando con una pantalla pref interna y luego activa la MISMA actividad (con el flag singleInstance, por ejemplo) preguntando por la pantalla pref general (raíz), no podrá llamar a findPreference() para buscar la pantalla de preferencia de raíz desde dentro de una pantalla de preferencia de niño.

Bueno, espero no haber hecho demasiada confusión ;-)

Cuestiones relacionadas