Cómo navegar a PreferencesSeries anidadas
En mi aplicación he anidado PreferencesScreen
<PreferencesScreen> <PreferencesScreen android:key="application"> </PreferencesScreen> </PreferencesScreen>
Ahora quiero disparar Intent
de tomarme de currrent Activity
directamente a las aplicaciones de preferencias subscreen. ¿Cómo puedo hacer esto?
En mi aplicación tengo la tarea similar para mostrar la pantalla PreferencesScreen
segundo nivel mediante programación. Lo que hice:
-
En
preferences.xml
he asignado una clave aPreferencesScreen
que quiero mostrar (como se muestra en la pregunta). -
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);
-
Luego en mi clase PreferenceActivity en el método
onCreate
se agregó 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 PreferencesScreen
segundo nivel, sino que toda la jerarquía de preferencias se ha cargado aquí. Por lo tanto, si pulsa el botón Back
, aparecerá la primera pantalla de PreferencesScreen
(principal). En mi caso, eso era exactamente lo que necesitaba. No estoy seguro del tuyo.
Esta es una manera de manejar el problema agarrando la pantalla infantil de antemano:
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; } } // ...
He resuelto exactamente su mismo problema 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. } }
A continuación, puede abrir la pantalla de preferencia interna con algo como esto:
Intent prefIntent = new Intent(ctx, MyPreferenceActivity.class); prefIntent.putExtra(Constants.PREFS_STARTING_PAGE, Constants.MY_PREF_SCREEN_1); startActivity(prefIntent);
Tenga en cuenta que esto funciona siempre y cuando las instancias de actividad sean diferentes: una instancia para la pantalla de preferencia principal y otra para la pantalla interna. De esta manera, cuando inicie la actividad sin parámetro "launch", siempre caerá en el caso de switch por defecto y nunca tendrá que configurar la pantalla de preferencias principal. El problema aquí es que si primero ejecuta la actividad que comienza con una pantalla pref interna y después la actividad SAME (con el flag singleInstance, por ejemplo) pidiendo la pantalla general (root) pref, no podrá llamar a findPreference () Para encontrar la pantalla de preferencias de raíz desde dentro de una pantalla de preferencia de niño.
Bueno, espero no haber hecho demasiada confusión 😉
La manera que utilizo es poner nido PreferenceScreen
en un archivo XML separado y utilizarlo en otro PreferenceActivity
. En este caso, podrás navegar a esta pantalla desde Preferencias usando Preference.setIntent()
y comenzar esta Activity
de manera habitual desde otra Activity
.