使用首选项点击事件

时间:2015-07-07 10:49:51

标签: android android-preferences preferenceactivity

我在尝试使用首选项的点击事件时遇到问题。有一个偏好,点击它,我打开一个具有不同偏好类别的子屏幕。我想要实现的是,如果某个条件为假,则应弹出一个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;的偏好。它会启动一个我希望阻止启动的子屏幕。对此有任何帮助将不胜感激。

2 个答案:

答案 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 类后我们发现:

preference onClick() event

这意味着始终调用 onClick()(如果首选项已启用且可选)并且不依赖于 mOnClickListener.onPreferenceClick 返回的布尔值