
>对于我在那里找到的每个设置,我提取值并更新相应的首选项(无论是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()的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)