我在尝试使用首选项的点击事件时遇到问题。有一个偏好,点击它,我打开一个具有不同偏好类别的子屏幕。我想要实现的是,如果某个条件为假,则应弹出一个Toast,子屏幕不应该打开。如果它是真的,它应该正常工作并打开子屏幕。为此,我尝试了以下代码:
mPref = (Preference) findPreference("abc");
mPref.setOnPreferenceClickListener(this);
@Override
public boolean onPreferenceClick(Preference preference) {
// TODO Auto-generated method stub
if (!condition) {
Toast.makeText(getActivity(), "Error", Toast.LENGTH_SHORT).show();
return true; // Consume click event.
}
return false;
}
xml的相关部分如下:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
android:key="abc"
android:summary="@string/string_turn_on"
android:textColor="@android:color/white"
android:title="@string/string_turn_on">
<PreferenceCategory
android:key="asa"
android:title="a" >
<com.example.gaurav.CustomPref
android:defaultValue="0"
android:key="st"
android:dependency="e"
android:showDefault="true"
android:summary="summary"
android:title="t" />
<com.example.gaurav.CustomPref
android:defaultValue="0"
android:key="st"
android:dependency="e"
android:showDefault="true"
android:summary="so"
android:title="so" />
</PreferenceCategory>
<PreferenceCategory
android:title="other" >
<CheckBoxPreference
android:defaultValue="false"
android:key="e"
android:title="eb" />
</PreferenceCategory>
</PreferenceScreen>
我已经改变了字符串等,但我认为它们不会导致这个错误,所以它不重要。它是关键&#34; abc&#34;的偏好。它会启动一个我希望阻止启动的子屏幕。对此有任何帮助将不胜感激。
答案 0 :(得分:0)
尝试在onCreate
方法
addPreferencesFromResource(R.xml.preferences);
编辑:
@Override
public boolean onPreferenceClick(Preference preference) {
if (condition) {
return true; // Consume click event.
}
Toast.makeText(getActivity(), "Error", Toast.LENGTH_SHORT).show();
return false;
}
答案 1 :(得分:0)
我刚刚遇到了这个问题,我解决了创建了一个自定义 Preference 类,该类覆盖了 onClick
事件和 setOnPreferenceClickListener
这是自定义类:
public class InterceptableEditTextPreference extends EditTextPreference {
private OnPreferenceClickListener customOnPreferenceClickListener;
public InterceptableEditTextPreference(Context context) {
super(context);
}
public InterceptableEditTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InterceptableEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onClick() {
if (customOnPreferenceClickListener != null) {
boolean handled = customOnPreferenceClickListener.onPreferenceClick(this);
if (handled) {
return;
}
}
super.onClick();
}
@Override
public void setOnPreferenceClickListener(OnPreferenceClickListener onPreferenceClickListener) {
customOnPreferenceClickListener = onPreferenceClickListener;
}
}
这样当你设置监听器时,返回值会被考虑到是否继续默认的点击行为(显示对话框):
editTextPreference.setOnPreferenceClickListener(preference -> {
if(someCondition) {
return true; // This prevent the PreferenceDialog to appear
// To manually show the dialog you can call:
// getPreferenceManager().showDialog(preference);
}
return false;
});
之前的“解决方法”应该是默认行为,但出于某种原因,分析 SDK Preference
类后我们发现:
这意味着始终调用 onClick()
(如果首选项已启用且可选)并且不依赖于 mOnClickListener.onPreferenceClick
返回的布尔值