Android一种为 all首选项触发onSharedPreferenceChange()的方法

Android一种为 all首选项触发onSharedPreferenceChange()的方法,第1张

概述>我通过读取文本文件并解析它来加载一组新设置. >对于我在那里找到的每个设置,我提取值并更新相应的首选项(无论是CheckPreference,ListPreference还是EditTextPreference). >所有这些都是从设置片段完成的.这意味着在进行更改时,首选项屏幕处于可见状态. >因为我以编程方式更改了vaules(editor().commit),所以不会触发onSharedP >我通过读取文本文件并解析它来加载一组新设置.
>对于我在那里找到的每个设置,我提取值并更新相应的首选项(无论是CheckPreference,ListPreference还是EditTextPreference).
>所有这些都是从设置片段完成的.这意味着在进行更改时,首选项屏幕处于可见状态.
>因为我以编程方式更改了vaules(editor().commit),所以不会触发onSharedPreferenceChange().

这就是我之后使用以下代码刷新所有首选项的原因:

private voID refreshPreferences() {    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);    for(int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {        onSharedPreferenceChanged(sp,getPreferenceScreen().getPreference(i).getKey());    }}

它完美地运作.我只是想知道是否存在一个系统调用以使所有首选项无效,从而实现相同的结果(自动调用onSharedPreferenceChanged())

我不是肛门,我只是不喜欢手动调用应该被OS调用的方法.

编辑
这是我当前更改首选项的代码.我之前尝试过使用编辑器进行更改,但也没有生成onSharePreferncesChanged()调用.
source:它是从文件中读取的多行字符串

private enum Type { INT,BOolEAN,EDITTEXT,List }; private voID loadPreference(int key,char [] source,Type t) {    String s = new String(source);    Log.i(TAG,"+ loadPreference(key:" + key + ",source:(" + s + "),t:" + t + ")");    String sKey = getText(key).toString();    Matcher m;    Preference p = findPreference(sKey);    switch( t ) {    case BOolEAN:        m = Pattern.compile("(?m)^" + sKey + "=\"(true|false)\"$").matcher(s);        if( m.find() ) ((CheckBoxPreference)p).setChecked(m.group(1).equals("true"));        break;    case INT:        m = Pattern.compile("(?m)^" + sKey + "=\"(\d+)\"$").matcher(s);        if( m.find() ) ((EditTextPreference)p).setText(m.group(1));        break;    case EDITTEXT:        m = Pattern.compile("(?m)^" + sKey + "=\"(.*)\"$").matcher(s);        if( m.find() ) ((EditTextPreference)p).setText(m.group(1));        break;    case List:        m = Pattern.compile("(?m)^" + sKey + "=\"(\d+)\"$").matcher(s);        if( m.find() ) ((ListPreference)p).setValueIndex(Integer.valueOf(m.group(1)));        break;    default:    }    Log.i(TAG,"- loadPreference()");}public voID onSharedPreferenceChanged(SharedPreferences prefs,String key) {    Log.i(TAG,"+ onSharedPreferenceChanged(prefs:" + prefs + ",key:" + key + ")");    if( key != null ) {        updatePreference(prefs,key);        updateSummary(findPreference(key));    } else {        Log.e(TAG,"Preference without key!");    }    Log.i(TAG,"- onSharedPreferenceChanged()");}@OverrIDepublic voID onResume() {    Log.i(TAG,"+ onResume()");    super.onResume();    // Set up a Listener    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferencechangelistener(this);    Log.i(TAG,"- onResume()");}@OverrIDepublic voID onPause() {    Log.i(TAG,"+ onPause()");    super.onPause();    // Unregister the Listener    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferencechangelistener(this);    Log.i(TAG,"- onPause()");}
解决方法 符合指南的方法是使用 OnSharedPreferenceChangeListener.

在你的问题的第4点,你说

Because I change the vaules programatically,
onSharedPreferenceChange() is not triggered.

这取决于您更改设置的方式.在你的观点2,你说

For each setting I found there I extract the value and update the
corresponding preference…

请确保您使用设置编辑器并提交更改,类似于:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);SharedPreferences.Editor editor = sp.edit();editor.putString("key","value"); // your updated settingeditor.commit();

如果您的其他类正确实现了OnSharedPreferencechangelistener并通过在默认的SharedPreferences上调用registerOnSharedPreferencechangelistener(this)来注册它,那么您应该能够在onSharedPreferenceChanged()方法中侦听这些更改.

至少这是Dev Guide on Settings中的文章所暗示的内容,并且我以类似的方式成功实现了它(“以编程方式”更改设置).

更新的答案:
由于您的评论说上面的内容不起作用,我再次查看了我的代码.事实上,我认为你想要从另一个班级实现这个目标,从而使你的问题变得错误.

如果您在PreferenceFragment(或PreferenceActivity)中,还可以实现OnSharedPreferencechangelistener接口,但要为当前PreferenceScreen中显示的首选项注册它.最佳做法是通过调用在onResume()中注册它

getPreferenceScreen().getSharedPreferences().registerOnSharedPreferencechangelistener(this);

然后在onPause()中取消注册:

getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferencechangelistener(this);

如前所述,您会在PreferenceFragment的onSharedPreferenceChanged()中收到首选项更改.这是(现在是真实的)它在我的代码中的工作方式.

总结

以上是内存溢出为你收集整理的Android一种为/ all首选项触发onSharedPreferenceChange()的方法全部内容,希望文章能够帮你解决Android一种为/ all首选项触发onSharedPreferenceChange()的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1128814.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存