[英]onPreferenceClick listener not working / onPreferenceClick not being called
I am trying to open a website when one of my preferences is clicked (not when the preference is actually changed because there isn't one). 我试图在单击我的一个首选项时打开一个网站(不是因为没有一个而实际上更改了首选项),所以我想打开一个网站。
The problem is that the onPreferenceClick()
is never called. 问题是永远不会调用onPreferenceClick()
。
This is my PreferenceActivity
: 这是我的PreferenceActivity
:
public class About extends PreferenceActivity implements
OnPreferenceClickListener {
TextView tv_developer;
TextView tv_version;
String versionName;
int counter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.about);
Preference p_developer = (Preference) findPreference("p_developer");
p_developer.setOnPreferenceClickListener(this);
Preference p_licences = (Preference) findPreference("p_licences");
p_licences.setOnPreferenceClickListener(this);
}
@Override
public boolean onPreferenceClick(Preference pref) {
// TODO Auto-generated method stub
Log.i("Anything pressed", "YES");
if (pref.getKey().equals("p_developer")) {
Log.i("p_developer", "YES");
} else {
Log.i("p_developer", "NO");
}
return true;
}
}
This is the xml: 这是xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="about"
android:title="About" >
<Preference
style="?android:preferenceInformationStyle"
android:key="p_licences"
android:title="p_licences" />
<PreferenceCategory android:title="Category" >
<Preference
style="?android:preferenceInformationStyle"
android:key="p_developer"
android:title="p_developer" />
</PreferenceCategory>
</PreferenceScreen>
I have also found that this does not do anything either: 我还发现这也不起作用:
<Preference android:title="@string/prefs_web_page" >
<intent android:action="android.intent.action.VIEW"
android:data="http://www.example.com" />
</Preference>
Add android:enabled="true"
to Preference
: 将android:enabled="true"
到Preference
:
<Preference
style="?android:preferenceInformationStyle"
android:key="p2"
android:enabled="true"
android:title="p2" />
You are using: 您正在使用:
PreferenceActivity.addPreferencesFromResource(R.layout.about);
Shouldn't it be more like: 它不应该更像是:
PreferenceActivity.addPreferencesFromResource(R.xml.yourxmlfilename);
Since thae preferences you defined are not a layout. 由于您定义的首选项不是布局。 You need to load the name of the .xml file , not the key of the preference in .xml. 您需要加载.xml文件的名称 ,而不是.xml中首选项的键。
So, put your preferences .xml file in the "xml" folder , and give it a name like "mypreferences.xml". 因此, 将您的首选项.xml文件放在“ xml”文件夹中 ,并为其命名,例如“ mypreferences.xml”。 Then, load it like that: 然后,像这样加载它:
PreferenceActivity.addPreferencesFromResource(R.xml.mypreferences);
In my project, the file looks like this: (name "settings.xml") 在我的项目中,文件如下所示:( 名称为“ settings.xml”)
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="Your Settings" >
<Preference
android:key="delete"
android:title="Delete User"
android:summary="Deletes the user." />
<!-- and so on -->
I add it to the PreferenceActivity by calling: 我通过调用将其添加到PreferenceActivity中:
PreferenceActivity.addPreferencesFromResource(R.xml.settings);
And set the onClickListener: 并设置onClickListener:
Preference deletePref = (Preference) findPreference("delete");
deletePref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
// do stuff
return true;
}
});
And it works. 而且有效。
Furthermore, you could try using a different name for title and key. 此外,您可以尝试使用其他名称作为标题和键。
Fresh answer here. 这里的新答案。
You need to declare listener first. 您需要先声明监听器。 And then attach that listener for each(!) of end Preference objects. 然后为最终首选项对象的每个(!)附加该侦听器。 Like these: 像这些:
final static int CAMERA_SLEEP_TIME=0,
CAMERA_TIME=1,
RESET=2;
private Preference.OnPreferenceClickListener listener =new Preference.OnPreferenceClickListener(){
@Override
public boolean onPreferenceClick(Preference preference) {
String keyLcl = preference.getKey();
if(keyLcl.equals(cameraSleepTime))
triggerPrefsDialog(CAMERA_SLEEP_TIME);
else
if (keyLcl.equals(cameraTime))
triggerPrefsDialog(CAMERA_TIME);
else
if (keyLcl.equals(reset))
triggerPrefsDialog(RESET);
else
return false;
return true;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
Resources resLcl = getResources();
cameraSleepTime=resLcl.getString(R.string.camera_sleep_time);
cameraTime=resLcl.getString(R.string.camera_time);
reset =resLcl.getString(R.string.reset);
PreferenceScreen sceenLcl = getPreferenceScreen();
PreferenceCategory pcLcl=(PreferenceCategory)sceenLcl.getPreference(1);
pcLcl.getPreference(0).setOnPreferenceClickListener(listener);
pcLcl.getPreference(1).setOnPreferenceClickListener(listener);
pcLcl=(PreferenceCategory)sceenLcl.getPreference(2);
pcLcl.getPreference(0).setOnPreferenceClickListener(listener);
l.a(pcLcl.getTitle());
}
And related preferences.xml: 以及相关的preferences.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceCategory
android:title="@string/switch_mode">
<CheckBoxPreference
android:key="@string/enable_switch"
android:defaultValue="true"
android:gravity="center"
android:title="@string/is_switched"
/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/seconds_category">
<Preference
android:key="@string/camera_time"
android:defaultValue="600000"
android:title="@string/camera_time"
/>
<Preference
android:key="@string/camera_sleep_time"
android:defaultValue="600000"
android:title="@string/camera_sleep_time"
/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/System">
<Preference
android:key="@string/reset"
android:defaultValue="false"
android:title="@string/reset"
/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/to_be_added">
</PreferenceCategory>
For me the solution was to extend the existing PreferenceCategory
class (in Support Library) and override isEnabled()
. 对我来说,解决方案是扩展现有的PreferenceCategory
类(在支持库中)并重写isEnabled()
。 This method always returned false
so I created a class called ClickablePreferenceCategory
and changed it to true
. 此方法始终返回false
因此我创建了一个名为ClickablePreferenceCategory
的类,并将其更改为true
。
In addition to that I had to add android:selectable="true"
to my custom Preference xml node. 除此之外,我还必须将android:selectable="true"
到我的自定义首选项xml节点中。 The result looks like this: 结果看起来像这样:
<PreferenceCategory
android:enabled="true"
android:key="@string/key_category_problem_solving"
android:selectable="true"
android:title="@string/problem_solving">
</PreferenceCategory>
And the ClickablePreferenceCategory
: 和ClickablePreferenceCategory
:
public class ClickablePreferenceCategory extends PreferenceCategory {
public ClickablePreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public ClickablePreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public ClickablePreferenceCategory(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ClickablePreferenceCategory(Context context) {
super(context);
}
@Override
public boolean isEnabled() {
return true;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.