[英]onPreferenceClick listener not working / onPreferenceClick not being called
我試圖在單擊我的一個首選項時打開一個網站(不是因為沒有一個而實際上更改了首選項),所以我想打開一個網站。
問題是永遠不會調用onPreferenceClick()
。
這是我的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;
}
}
這是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>
我還發現這也不起作用:
<Preference android:title="@string/prefs_web_page" >
<intent android:action="android.intent.action.VIEW"
android:data="http://www.example.com" />
</Preference>
將android:enabled="true"
到Preference
:
<Preference
style="?android:preferenceInformationStyle"
android:key="p2"
android:enabled="true"
android:title="p2" />
您正在使用:
PreferenceActivity.addPreferencesFromResource(R.layout.about);
它不應該更像是:
PreferenceActivity.addPreferencesFromResource(R.xml.yourxmlfilename);
由於您定義的首選項不是布局。 您需要加載.xml文件的名稱 ,而不是.xml中首選項的鍵。
因此, 將您的首選項.xml文件放在“ xml”文件夾中 ,並為其命名,例如“ mypreferences.xml”。 然后,像這樣加載它:
PreferenceActivity.addPreferencesFromResource(R.xml.mypreferences);
在我的項目中,文件如下所示:( 名稱為“ 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 -->
我通過調用將其添加到PreferenceActivity中:
PreferenceActivity.addPreferencesFromResource(R.xml.settings);
並設置onClickListener:
Preference deletePref = (Preference) findPreference("delete");
deletePref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
// do stuff
return true;
}
});
而且有效。
此外,您可以嘗試使用其他名稱作為標題和鍵。
這里的新答案。
您需要先聲明監聽器。 然后為最終首選項對象的每個(!)附加該偵聽器。 像這些:
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());
}
以及相關的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>
對我來說,解決方案是擴展現有的PreferenceCategory
類(在支持庫中)並重寫isEnabled()
。 此方法始終返回false
因此我創建了一個名為ClickablePreferenceCategory
的類,並將其更改為true
。
除此之外,我還必須將android:selectable="true"
到我的自定義首選項xml節點中。 結果看起來像這樣:
<PreferenceCategory
android:enabled="true"
android:key="@string/key_category_problem_solving"
android:selectable="true"
android:title="@string/problem_solving">
</PreferenceCategory>
和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.