よりクリーンなアプローチについては、新しく受け入れられた回答を参照してください。これは機能していましたが、実際にはクリーンな方法ではありませんでした。
くそー、数時間かかりましたが、ようやく機能しました。
解決策は文書化されていない呼び出しpublic void onItemClick (...)
です。いくつかの引数を取り、この質問で指摘されているように、呼び出したい要素のインデックスに従ってクリックをシミュレートするために使用できます。
私の問題は、呼び出したい項目が XML 構造に深くネストされていることでした。しかし、解決策は非常に簡単です。開きたいアイテムに akey
を追加します。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 );
そして、ダイアログがポップアップします!
設定を移動したり XML を変更したりすると、自動ダイアログが静かに中断され、気付かれない可能性があるため (テストされていない場合) 、 PreferenceScreen
aが入っていると便利ですPreference
(そのため、自分がどこにいるかを知る必要はありません)。Preference
このために、すべての設定を検索し、設定がオンになっていることを返す関数を作成した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" );