Voir le nouveau accepté de réponse beaucoup plus propre approche! C'était du travail, mais pas vraiment le propre façon de faire.
Putain, il m'a eu plusieurs heures, mais il fonctionne enfin.
La solution est le sans-papiers, appel public void onItemClick (...)
. Il prend plusieurs arguments, et comme l'a souligné à cette question, il peut être utilisé pour simuler un clic selon l'indice de l'élément que vous souhaitez appeler.
Mon problème était le point je tiens à appeler est profondément imbriquée dans un XML de la structure. Mais la solution est très simple: ajouter un key
de la PreferenceScreen
l'élément que vous souhaitez ouvrir est dans:
<PreferenceScreen
android:key="pref_key"
....
/>
<ListPreference android:key="abc"
android:title="@string/abc"
android:summary="@string/cde"
android:persistent="true"/>
</PreferenceScreen>
Et la vous pouvez simplement à la suivante:
// the preference screen your item is in must be known
PreferenceScreen screen = (PreferenceScreen) findPreference("pref_key");
// the position of your item inside the preference screen above
int pos = findPreference("abc").getOrder();
// simulate a click / call it!!
screen.onItemClick( null, null, pos, 0 );
Et la boîte de Dialogue pop-up!
Il serait agréable de se PreferenceScreen
un Preference
est (de sorte que vous n'aurait pas à savoir où votre Preference
est), parce que le déplacement de la préférence/modifier le XML pourrait briser le automatique de la boîte de dialogue en silence et de ne pas se faire remarquer (si pas testé).
Pour cela, j'ai écrit une fonction qui permet de rechercher à travers toutes les préférences et le retour de la PreferenceScreen
votre préférence, de sorte que vous n'avez pas besoin d'avoir votre PreferenceScreen une clé!
private PreferenceScreen findPreferenceScreenForPreference( String key, PreferenceScreen screen ) {
if( screen == null ) {
screen = getPreferenceScreen();
}
PreferenceScreen result = null;
android.widget.Adapter ada = screen.getRootAdapter();
for( int i = 0; i < ada.getCount(); i++ ) {
String prefKey = ((Preference)ada.getItem(i)).getKey();
if( prefKey != null && prefKey.equals( key ) ) {
return screen;
}
if( ada.getItem(i).getClass().equals(android.preference.PreferenceScreen.class) ) {
result = findPreferenceScreenForPreference( key, (PreferenceScreen) ada.getItem(i) );
if( result != null ) {
return result;
}
}
}
return null;
}
private void openPreference( String key ) {
PreferenceScreen screen = findPreferenceScreenForPreference( key, null );
if( screen != null ) {
screen.onItemClick(null, null, findPreference(key).getOrder(), 0);
}
}
// With this, you can call your `Preference` like this from code, you do
// not even have to give your PreferenceScreen a key!
openPreference( "abc" );