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