Смотрите новый принятый ответ для более чистого подхода!Это работало, но на самом деле это не совсем чистый способ.
Черт возьми, у меня это получилось несколько часов, но наконец-то это работает.
Решение - недокументированный вызов public void onItemClick (...)
.Он принимает несколько аргументов, и, как указывает этот вопрос , его можно использовать для имитации щелчка в соответствии с индексом элемента, который вы хотите вызвать.
Моя проблема заключалась в элементе Iхочу позвонить глубоко вложен в XML-структуру.Но решение очень простое: добавьте key
к PreferenceScreen
элементу, в котором вы хотите открыть:
<PreferenceScreen
android:key="pref_key"
....
/>
<ListPreference android:key="abc"
android:title="@string/abc"
android:summary="@string/cde"
android:persistent="true"/>
</PreferenceScreen>
И вы можете сделать следующее:
// 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 );
И Диалог всплывает!
Было бы неплохо получить PreferenceScreen
a Preference
(так что вам не нужно было бы знать, где находится ваш Preference
), потому что перемещениепредпочтение / изменение XML может молча нарушить автоматический диалог и может не быть замечено (если не проверено).
Для этого я написал функцию, которая будет искать все предпочтения и возвращать PreferenceScreen
, которое вы предпочитаете:, поэтому вам не нужно, чтобы ваш PreferenceScreen был ключом!
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" );