Android的preferenceScreen onChangeListener未调用 [英] Android PreferenceScreen onChangeListener not invoked

查看:167
本文介绍了Android的preferenceScreen onChangeListener未调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了一个简单的preferenceScreen,如下所示:

 公共类SettingsActivity扩展preferenceActivity实现在$ P $ {pferenceChangeListener@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    加preferencesFromResource(R.xml.settings);    preferenceScreen prefScreen = GET preferenceScreen();
    prefScreen.setOn preferenceChangeListener(本);}@覆盖
在preferenceTreeClick公共布尔(preferenceScreen preferenceScreen,preference preference){
    如果(preference.getTitle()。等于(的getString(R.string.settings_diverse_about))){
        // TODO关于对话框打开
    }    返回super.on preferenceTreeClick(preferenceScreen,preference);
}私人静态字符串PATTERN_EMAIL =[A-Z0-9 ._% - ] + @ [A-Z0-9 .-] + \\\\ [A-Z] {2,4};
私人静态字符串PATTERN_TWITTER =[A-ZA-Z0-9 _-] +;@覆盖
在preferenceChange公共布尔(preference preference,对象为newValue){
    字符串prefTitle = preference.getTitle()的toString()。    //手机将inputType下得到充分的处理    串中newstr = newValue.toString();    如果(prefTitle.equals(的getString(R.string.settings_contact_email))){
        返回newStr.trim()匹配(PATTERN_EMAIL)。
    }否则如果(prefTitle.equals(的getString(R.string.settings_contact_twitter))){
        返回newStr.trim()匹配(PATTERN_TWITTER)。
    }    返回true;
}

问题是,上preferenceChange方法被调用永远不会。
此外,你怎么看待有关验证属性的方式吗?
我觉得这不是真的最优的。

  preference.getTitle()。等于(的getString(R.string.settings_diverse_about))


解决方案

我有同样的问题。我试图建立一个在preferenceChangeListener但是这是错误的。我真正需要的是一个onShared preferenceListener。

  OnShared preferenceChangeListener侦听器;

您的preference活动在OnCreate

写这():

  =监听新的共享preferences.OnShared preferenceChangeListener(){
    公共无效onShared preferenceChanged(共享preferences preFS,串键){
        //这里您可以工作。
        //重要提示:当心,在这一点上,preference已经改变了!
    }
};共享preferences preFS = getShared preferences(getPackageName()+_ preferences,MODE_PRIVATE);
prefs.registerOnShared preferenceChangeListener(监听);

i wrote a simple PreferenceScreen, looks as follows:

public class SettingsActivity extends PreferenceActivity implements OnPreferenceChangeListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.settings);

    PreferenceScreen prefScreen = getPreferenceScreen();
    prefScreen.setOnPreferenceChangeListener(this);

}

@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
    if (preference.getTitle().equals(getString(R.string.settings_diverse_about))) {
        // TODO open about dialog
    }

    return super.onPreferenceTreeClick(preferenceScreen, preference);
}

private static String PATTERN_EMAIL = "[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}";
private static String PATTERN_TWITTER = "[a-zA-Z0-9_-]+";

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
    String prefTitle = preference.getTitle().toString();

    // phone will be fully handled by inputType

    String newStr = newValue.toString();

    if (prefTitle.equals(getString(R.string.settings_contact_email))) {
        return newStr.trim().matches(PATTERN_EMAIL);
    } else if (prefTitle.equals(getString(R.string.settings_contact_twitter))) {
        return newStr.trim().matches(PATTERN_TWITTER);
    }

    return true;
}

The problem is, the onPreferenceChange method gets never invoked. Furthermore, what do you think about the way of validating the attributes? I think it's not really optimal.

preference.getTitle().equals(getString(R.string.settings_diverse_about))

解决方案

I had the same problem. I tried to set up a onPreferenceChangeListener but that was wrong. What I really needed was an onSharedPreferenceListener.

OnSharedPreferenceChangeListener listener;

Write this in the onCreate() of your Preference activity:

listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        // Here you can work.
        // IMPORTANT:  Beware that at this point the preference has already been changed!
    }
};

SharedPreferences prefs = getSharedPreferences(getPackageName() + "_preferences", MODE_PRIVATE);
prefs.registerOnSharedPreferenceChangeListener(listener);

这篇关于Android的preferenceScreen onChangeListener未调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆