请参阅新接受的答案以获得更清洁的方法!这是有效的,但不是真正干净的方式。
该死的,它花了我几个小时,但它终于奏效了。
解决方案是无证调用public void onItemClick (...)
。它需要几个参数,正如这个问题所指出的,它可用于根据您要调用的元素的索引来模拟点击。
我的问题是我要调用的项目深深嵌套在 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" );