- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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() )
我不是肛门,我只是不喜欢手动调用应该由操作系统调用的方法。
编辑
这是我当前更改首选项的代码。我之前尝试使用编辑器进行更改,但也没有生成 onSharePreferncesChanged() 调用。
来源:它是从文件中读取的多行字符串
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()");
}
@Override
public void onResume() {
Log.i(TAG, "+ onResume()");
super.onResume();
// Set up a listener
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
Log.i(TAG, "- onResume()");
}
@Override
public 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 setting
editor.commit();
如果您的其他类正确地实现了一个 OnSharedPreferenceChangeListener
并通过在您的默认 SharedPreferences
上调用 registerOnSharedPreferenceChangeListener(this)
注册了它,您应该能够在 onSharedPreferenceChanged()
方法中监听这些变化。
至少Dev Guide on Settings中的文章是这样的建议并且我已经以类似的方式成功实现了它(“以编程方式”更改设置)。
更新后的答案:
由于您的评论说以上内容无效,因此我再次查看了我的代码。事实上,我认为你想从不同的类(class)实现这一目标,所以我错了你的问题。
如果您在 PreferenceFragment
(或 PreferenceActivity
)中,您还可以实现OnSharedPreferenceChangeListener
接口(interface),但要为当前 PreferenceScreen
中显示的首选项注册它。最佳做法是通过调用在 onResume()
中注册它
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
然后在onPause()
中注销:
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
如前所述,您随后会在 PreferenceFragment
的 onSharedPreferenceChanged()
中收到首选项更改。这是(现在是真实的)它在我的代码中的工作方式。
关于Android 一种为一个/所有偏好触发 onSharedPreferenceChange() 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14924451/
方法onSharedPreferenceChanged进入无限循环。我不明白为什么更改首选项会导致事件再次触发。 @Override public void onSharedPrefe
因此,当首选项更改时,我尝试更新timers.java 类中的值。这是我的timers.java中的值 final boolean soundEnabledPref = sharedPref.getB
我有一个非常标准的 PreferenceFragment 使用 @Override public void onCreate(Bundle savedInstanceState) { supe
我最近将 HoloEverywhere 库从 GitHub 导入到 Eclpse 中,并开始在已经运行的应用程序中使用它。总的来说,我对图书馆很满意,一切进展顺利。 我正在尝试使用 org.holoe
我对这个方法有一个奇怪的问题。它被称为,当我编辑 EditTextPreference 时,只有当我更改值时,并且只有在我第一次更改时才在 MultiSelectListPreference 上。这是
我的首选项都会在更改时触发 onSharedPreferenceChanged 事件。它适用于所有首选项:复选框、列表、自定义等。但如果我从 RingtonePreference 中选择铃声,则不会调
我设置了几个 CheckBoxPreferences,我的偏好类扩展了 PreferenceActivity 并实现了 OnSharedPreferenceChangeListener这就是我用来回应
尝试按照 http://developer.android.com/guide/topics/ui/settings.html 中给出的示例进行操作但发现很难,因为它会在使用和不使用 fragment
创建首选项 Activity 后,我注意到尽管调用了 onSharedPreferenceChanged,但当我的复选框首选项被选中时,我的主要 Activity 并没有改变主题。有谁知道出了什么问题
onSharedPreferenceChanged调用后如何重启应用? ActivityPreferences.java: [..] public static class FragmentPrefe
我想在用户从我的 preferenceActivity 中的 ListPreference 中选择特定项目时显示一个对话框。但是,我无法让 onSharedPreferenceChanged() 工作
onSharedPreferenceChanged() 监听器没有要返回的 bool 类型,而 onPreferenceChanged() 监听器有。 那么如何在验证后拒绝更改? 我想到的唯一方法是将
我有一个偏好 Activity ,起初当我有一个偏好时,onPreferenceChange 会按预期触发一次。 但是,一段时间后(去不同的 Activity 等) onPreferenceChang
我有一个单例类,它注册了一个偏好更改监听器,例如: PreferenceManager.getDefaultSharedPreferences(context.getApplicationContex
我有一个 PreferenceScreen,其中有一个 CheckBox Preference 和一个调用自定义对话框的简单 Preference。在此自定义对话框中,用户可以选择一个数字。通过在此对
我在 XML 文件中定义了一个 PreferenceScreen,如下所示:
我遇到了 SharedPreferences 及其监听器的奇怪行为。我在我的应用程序中只使用一个 SharedPreference 实例,我使用 PreferenceManager.getDefaul
因此,我尝试使用共享首选项中的 onSharedPreferenceChanged 在 Activity 之间传递对象: 在一个 Activity 类中,我这样调用首选项: mPrefs = Pre
我有一个子屏幕: 我在中实例化首选项 public class GamePreferenceActivity extends PreferenceActivity
我通过读取文本文件并解析它来加载一组新设置。 对于在那里找到的每个设置,我都提取值并更新相应的首选项(无论是 CheckPreference、ListPreference 还是 EditTextPre
我是一名优秀的程序员,十分优秀!