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:

  1. En preferences.xml he asignado una clave a PreferencesScreen que 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 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 .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.