如何打开或模拟一个Android的偏好,用XML编程创build的点击?

我有一个android应用程序的首选项在XML中声明,使用addPreferencesFromResource加载。 用户可以打开首选项,点击每个项目并编辑它们,所有的作品。

我喜欢的一个偏好是:

  <ListPreference android:key="abc" android:title="@string/abc" android:summary="@string/cde" android:persistent="true"/> 

如何自动向用户显示首选项对话框(不需要用户转到首选项屏幕并单击它?)。

我试过( (android.preference.DialogPreference) prefMgr.findPreference( "abc" )).showDialog(null) ,但是说它是一个受保护的方法…? 从我的主要活动(这是一个PreferenceActivity )调用它,这就是为什么它显然不能工作。 但是如何呢?

编辑

我只是发现两个线程( 1和2 )的想法使用findViewById访问首选项,但没有成功。 它总是返回null (也适用于我)。

它看起来真的没有可能从代码做到这一点。

您可以扩展ListPreference来创build对话框,然后包含您自己的公用方法,该方法调用ListPreference的protected showDialog方法。 就像是:

 public void show() { showDialog(null); } 

这样你就不会碰到getOrder()的问题,因为有几个人在评论中指出你的答案时有PreferenceGroups。

这可以通过任何具有受保护的showDialog方法的首选项来完成。

看到新的接受的答案更清洁的方法! 这是工作,但不是真正干净的做法。


该死的,它让我几个小时,但终于奏效。

解决scheme是无证的调用public void onItemClick (...) 。 它需要几个参数,正如这个问题所指出的,它可以用来根据你想调用的元素的索引来模拟一个点击。

我的问题是我想要调用的项目深深嵌套在XML结构中。 但是解决scheme非常简单:向PreferenceScreen添加一个key ,您想要打开的项目位于:

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

popup对话框!

Preference是一个Preference (这样你就不必知道你的Preference是在哪里了),因为移动偏好/改变XML可能会自动破坏自动对话框并且可能不会被注意到(如果没有被testing的话)。

为此,我编写了一个函数,它将search所有偏好,并返回您偏好的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" ); 
  PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("pref_key"); final ListAdapter listAdapter = preferenceScreen.getRootAdapter(); EditTextPreference editPreference = (EditTextPreference) findPreference("set_password_preference"); final int itemsCount = listAdapter.getCount(); int itemNumber; for (itemNumber = 0; itemNumber < itemsCount; ++itemNumber) { if (listAdapter.getItem(itemNumber).equals(editPreference)) { preferenceScreen.onItemClick(null, null, itemNumber, 0); break; } } } } 

提高deepak goel的答案:

 private void openPreference(String key) { PreferenceScreen preferenceScreen = getPreferenceScreen(); final ListAdapter listAdapter = preferenceScreen.getRootAdapter(); final int itemsCount = listAdapter.getCount(); int itemNumber; for (itemNumber = 0; itemNumber < itemsCount; ++itemNumber) { if (listAdapter.getItem(itemNumber).equals(findPreference(key))) { preferenceScreen.onItemClick(null, null, itemNumber, 0); break; } } } 

如果使用支持库,可以使用PreferenceManager.showDialog(首选项)轻松打开对话框。

在您的PreferenceFragmentCompat:

 getPreferenceManager().showDialog(findPreference("pref_name")); 

请注意,支持首选项包有许多问题: 非物质样式 , 并在打开的对话框旋转时崩溃 。

等等,你也可以做这样的事情

 Preference p=findPreference("settings_background_color"); p.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { int color=PreferenceManager.getDefaultSharedPreferences(ALifePatternsWallpaperSettings.this).getInt("settings_background_color", Color.BLACK); new ColorPickerDialog(ALifePatternsWallpaperSettings.this, ALifePatternsWallpaperSettings.this, "settings_background_color", color, Color.BLACK).show(); return true; } }); 

嗨,朋友试试这个代码在工作正常

 getPreferenceManager().findPreference("YOUR PREF_KEY").setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { //your code here return true; } });