Bar*_*ick 15 android preferenceactivity onclicklistener
我正在构建一个Preference Activity,其中列表中的大多数首选项将执行代码而不直接修改SharedPreference.我的preferences.xml文件看起来像这样.
<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>
Run Code Online (Sandbox Code Playgroud)
我的目标是在单击其中一个首选项时执行一段代码.与Google Play设置首选项菜单中的"清除搜索记录"类似.(http://i.imgur.com/qnHbJX9.png)
有谁知道如何使这成为可能?
我必须补充一点,我尝试使用findPreference("KeyNameHere"),但它总是返回null.
谢谢!
编辑:
我在此代码中添加并实现了OnPreferenceClickListener:
@Override
public boolean onPreferenceClick(Preference preference) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
但这种方法永远不会被调用.还有另一种方法吗?
编辑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" />
Run Code Online (Sandbox Code Playgroud)
并称之为:
getPreferenceScreen().setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
然后我实际上从click事件中得到了响应.唯一的缺点是我必须删除首选项分组.任何人都知道为什么这是和任何方法来解决它?
Hoa*_*yen 15
实施OnPreferenceClickListener和实施onPreferenceClick
@Override
public boolean onPreferenceClick (Preference preference)
{
String key = preference.getKey();
// do what ever you want with this key
}
Run Code Online (Sandbox Code Playgroud)
bd9*_*d95 13
也许这对OP来说无用,但可能对其他人有用.我想写一些总结; 一般来说,您可以主要遵循以下三种方式:1)您可以在代码中的某处找到您的偏好
Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE);
Run Code Online (Sandbox Code Playgroud)
然后你可以添加一个点击监听器并覆盖它的on click方法
examplePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
// handle click here
}
});
Run Code Online (Sandbox Code Playgroud)
必须为要监听其点击的每个首选项执行此操作2)您可以在设置片段/活动中实现Preference.OnPreferenceClickListener接口,并通过使用switch构造或if-else if-else if覆盖onPreferenceClick一次-...构建并合并所有单个处理; 它应该是这样的:
@Override
public boolean onPreferenceClick(Preference preference) {
switch (preference.getKey()) {
case KEY_EXAMPLE_PREFERENCE: {
// handle click here
}
break;
case ...
}
}
Run Code Online (Sandbox Code Playgroud)
然后,你仍然需要找到每个偏好,但你可以简单地调用每个偏好
setOnPreferenceClickListener(this);
Run Code Online (Sandbox Code Playgroud)
(我认为OP的实现不起作用(他的方法没有被调用)因为这最后一部分)我们将"this"作为参数传递,因为我们实现了单击侦听器接口
3)(我认为这是最简单的)你可以覆盖
onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
Run Code Online (Sandbox Code Playgroud)
在你的偏好片段/活动中没有实现任何其他接口,你可以复制选项2)的if-else if -...构造的开关; 主要的优点是你不需要找到每个首选项并调用它们setOnPreferenceClickListener.
希望这对某人有用!
mar*_*mor 10
只是覆盖:
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
String key = preference.getKey();
...
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
Run Code Online (Sandbox Code Playgroud)
我提出了自己的(我认为真的搞砸了)解决方案; 但它的确有效.
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;
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
所以我学到的是有一个分层系统,其工作方式如下:PreferenceScreen有子项PreferenceCategory有子项首选项,正如您在XML文件中看到的那样.我的问题是我无法直接从PreferenceScreen设置首选项'onClickListeners.所以我创建了两个for循环,这些循环将分解到每个Preference并为每个Preference设置一个OnPreferenceClickListener.凌乱,但最后工作.
小智 8
您还可以找到首选项并设置单击侦听器.
Preference connectToNewComputer= findPreference("connectToNewComputer");
connectToNewComputer.setOnPreferenceClickListener(this);
Run Code Online (Sandbox Code Playgroud)
其他答案对我来说在Androidx中不起作用。我从Android 开发者指南中实现了设置
请参阅以下实施点击侦听器的指南
1)在您的设置片段中实现PreferenceManager.OnPreferenceTreeClickListener,如下面的代码
import androidx.preference.PreferenceManager;
class SettingsFragment extends PreferenceFragmentCompat implements PreferenceManager.OnPreferenceTreeClickListener {
Run Code Online (Sandbox Code Playgroud)
2) 在 SettingsFragment 中覆盖 onPreferenceTreeClick
@Override
public boolean onPreferenceTreeClick(Preference preference) {
String key = preference.getKey();
switch (key) {
case "key1":
return true;
case "key2":
return true;
//codes
}
}
Run Code Online (Sandbox Code Playgroud)