2013-03-20 98 views
13

我正在构建一个首选项活动,其中列表中的大多数首选项都将执行代码,而不是直接修改SharedPreference。我的preferences.xml文件看起来像这样。偏好活动偏好Click Click Listener

<PreferenceCategory 
    android:title="Connection" > 

    <Preference 
     android:id="@+id/settings_connectToNewComputer" 
     android:key="connectToNewComputer" 
     android:summary="Currently connected to:" 
     android:title="Connect to new computer" /> 

    <Preference 
     android:id="@+id/removeDevice" 
     android:key="removeDevice" 
     android:summary="Remove this device from the computer's whitelist" 
     android:title="Remove this device from computer" /> 

</PreferenceCategory> 

<PreferenceCategory 
    android:title="About" > 

    <Preference 
     android:id="@+id/settings_About" 
     android:key="about" 
     android:summary="About me and my thanks to those who made this app great" 
     android:title="About Hue Pro" /> 

    <Preference 
     android:id="@+id/contact" 
     android:key="contact" 
     android:summary="Contact me with comments, bugs, and suggestions for updates" 
     android:title="Contact me" /> 

</PreferenceCategory> 

我的目标是有点击这些偏好的一个时执行的代码块。与Google Play设置首选项菜单中的“清除搜索记录”类似。 (http://i.imgur.com/qnHbJX9.png

有谁知道如何使这成为可能?

我必须补充说我已经尝试使用findPreference(“KeyNameHere”),但它总是返回null。

谢谢!


编辑:

我在此代码添加和实施OnPreferenceClickListener:

@Override 
public boolean onPreferenceClick(Preference preference) { 
    return false; 
} 

但这种方法不会被调用。有没有另一种方法来做到这一点?


编辑2:

我发现,如果我拿出PreferenceCategory标签,所以我离开了这一点:

<Preference 
    android:id="@+id/settings_connectToNewComputer" 
    android:key="connectToNewComputer" 
    android:summary="Currently connected to:" 
    android:title="Connect to new computer" /> 

<Preference 
    android:id="@+id/removeDevice" 
    android:key="removeDevice" 
    android:summary="Remove this device from the computer's whitelist" 
    android:title="Remove this device from computer" /> 

<Preference 
    android:id="@+id/settings_About" 
    android:key="about" 
    android:summary="About me and my thanks to those who made this app great" 
    android:title="About Hue Pro" /> 

<Preference 
    android:id="@+id/contact" 
    android:key="contact" 
    android:summary="Contact me with comments, bugs, and suggestions for updates" 
    android:title="Contact me" /> 

并称之为:

getPreferenceScreen().setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 

     @Override 
     public boolean onPreferenceClick(Preference preference) { 
      return false; 
     } 
    }); 

然后我实际上得到了点击事件的响应。唯一的缺点是我必须删除偏好分组。任何人都知道这是为什么和解决它的方法?

回答

7

我想到了我自己的(我相信这是真的搞砸)解决方案;但它的工作原理。

for(int x = 0; x < getPreferenceScreen().getPreferenceCount(); x++){ 
     PreferenceCategory lol = (PreferenceCategory) getPreferenceScreen().getPreference(x); 
     for(int y = 0; y < lol.getPreferenceCount(); y++){ 
      Preference pref = lol.getPreference(y); 
      pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener(){ 

       @Override 
       public boolean onPreferenceClick(Preference preference) { 
        return false; 
       } 

      }); 
     } 
    } 

所以我打听有没有是像一个等级制度:PreferenceScreen有孩子PreferenceCategory有孩子偏好,因为你可以在XML文件中看到。我的问题是我无法直接从PreferenceScreen设置偏好设置onClickListeners。所以我做了两个for循环,每个Preference都会设置一个OnPreferenceClickListener,并为它们中的每一个设置一个OnPreferenceClickListener。凌乱,但终于奏效。

+1

+1您的解决方案暗示了我在我的应用程序中选择的内容。我创建一个String类型的数组,然后为每个数组获取'Preference'并设置'onPreferenceClick'。这是几行代码。谢谢。 – Sufian 2014-08-12 06:15:42

+0

虽然这可能看起来不错,但是使用的方法已被弃用。如果您有更新的答案,请编辑您的帖子。注意getPreferenceScreen()已被弃用。谢谢 – ralphgabb 2015-05-04 00:43:12

11

实施OnPreferenceClickListener并在onPreferenceClick

@Override 
public boolean onPreferenceClick (Preference preference) 
{ 
    String key = preference.getKey(); 
    // do what ever you want with this key 
} 
+0

谢谢你的快速反应!请参阅原文中的第一次编辑。 – BarryBostwick 2013-03-21 00:34:47

+1

那么您是否实现了OnPreferenceClickListener? – 2013-03-21 00:41:45

+0

我试图实现,但我遇到的问题是我永远不会从代码中加载任何偏好对象。正如我在我原来的帖子中写道,findPreference(“KeyNameHere”),所以我永远无法找到一个方法来实现OnPreferenceClickListener总是返回null。 – BarryBostwick 2013-03-21 01:06:55

8

您还可以找到首选项并设置点击侦听器。

Preference connectToNewComputer= findPreference("connectToNewComputer"); 
connectToNewComputer.setOnPreferenceClickListener(this); 
7

也许这对OP没有用,但可能对其他人有用。 我想写一个摘要; 1)你可以用

Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE); 

某处你的代码中找到自己的喜好,然后你可以添加一个点击监听,并覆盖其上单击的方式与

examplePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 
    @Override 
    public boolean onPreferenceClick(Preference preference) { 
     // handle click here 
    } 
}); 
:在一般情况下,你可以主要有三种方式跟随

这对每一个首选项,你要听 2,其点击)可实现Preference.OnPreferenceClickListener接口设置片段/活动,覆盖onPreferenceClick只有一次,使用的if-else如果交换机结构或做-else if -...构造并合并所有单个处理;它应该是这样的:

@Override 
public boolean onPreferenceClick(Preference preference) { 
    switch (preference.getKey()) { 
     case KEY_EXAMPLE_PREFERENCE: { 
      // handle click here 
     } 
     break; 
     case ... 
    } 
} 

然后,你还是要找到每个偏好,但你可以在他们每个人只需拨打

setOnPreferenceClickListener(this); 

(我认为业务方案的实施没有工作(他因为这最后一部分的方法,不叫)) 我们传递“这个”作为参数,因为我们实施了点击监听器接口

3)(我认为这是最简单的),你可以重写

onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) 
在没有实施任何其它接口您的喜好片段/活性

在那里你可以复制的if-else如果-...的开关构建选项2);主要优点在于您不需要查找每个首选项并调用setOnPreferenceClickListener。

希望这将是有用的人!

+0

帮助了我,谢谢。 – 2017-09-11 23:21:36

5

只是覆盖:

@Override 
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 

    String key = preference.getKey(); 
    ... 

    return super.onPreferenceTreeClick(preferenceScreen, preference); 
} 
+0

谢谢,它帮助我 – 2015-02-08 21:04:50

+0

谢谢,真正的答案在这里! – DiegoAlt 2017-06-14 03:09:22

0

您的喜好对象不会得到空当,你会发现以下 (从项目copypasting):

public class ImePreferences extends PreferenceActivity { 

.....

@Override 
protected boolean isValidFragment(String fragmentName) { 
    return Settings.class.getName().equals(fragmentName); 
} 

.....

public static class Settings extends InputMethodSettingsFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setInputMethodSettingsCategoryTitle(R.string.language_selection_title); 
     setSubtypeEnablerTitle(R.string.select_language); 

     // Load the preferences from an XML resource 
     addPreferencesFromResource(R.xml.ime_preferences); 
     Preference pLcl = getPreferenceScreen().findPreference(getResources().getString(
       R.string.dictionary_button)); 
     pLcl.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 
      @Override 
      public boolean onPreferenceClick(Preference preference) { 
       // handle click here 
       l.a("this is the click"); 
       return true; 
      } 
     }); 
     if(pLcl != null) 
      l.a(6576); 
    } 
} 

.....

}