- 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/
typedef unsigned char uChar; typedef signed char sChar; typedef unsigned short uShort; typedef signe
我正在编写一个 android 应用程序并想做一个 SettingsActivity。 我的问题是我的矢量可绘制对象不会使其颜色适应夜间或白天主题。 ic_palette_black_24dp.xml
我正在使用多语言闹钟 android 应用程序工作: 1 个 xml 文件 [alarm_settings.xml] 2 个 string.xml 文件 [英语和阿拉伯语] 问题是本地化没有以正确的方
我正在尝试创建一个 SettingsActivity 并使用扩展 PreferenceFragment 的 Fragment 来实现此目的。我的 Activity 正在显示,而首选项不是。 Setti
我知道在使用自动属性时,编译器会在屏幕后面创建自己的支持字段。然而,在我阅读以学习的许多程序中,我看到人们明确地写 private int _backingField; public int Prop
在写入事件日志时,我可以创建一个 EventLog 实例,将其作为成员变量保存,并在每次我想记录消息时对其调用 WriteEntry(string message)。 或者,我可以只调用静态版本:Ev
如何通过ListPreference值设置依赖? 最佳答案 正如 Snicolas 已经指出的那样,依赖 xml 功能仅检查 bool 状态(= 如果引用的键为真或在其中设置了值)。如果启用,您可
如果我使用 Preference API存储用户或系统偏好,它们在 Windows 和 Unix 上存储在哪里? 最佳答案 对于 Windows,systemRoot 和 userRoot 分别存储在
测试 android.preference.PreferenceActivity 时,我收到以下警告: warning: [deprecation] getFragmentManager() in A
在优先级Activity中我们可以使用这两个方法SetContentView(R.layout.main) 和 addXmlFromResources(R.xml.Preferences) 用于自定义
在我的 Android 应用程序中,我有一个偏好 Activity ,让用户可以覆盖应用程序的语言。为此,我在每个 Activity 的 onResume() 中调用此函数,然后重置内容 View :
在我的preferences.xml 中,我有一个这样的偏好元素: 我想分配 onClick 事件,所以如果用户点击它,我将能够打开新的 Intent 或浏览器。我尝试像使用按钮一样进行操作,但这似
这是我的PreferenceActivity(我的主要 Activity 的内部类) public static class TestSettings extends PreferenceActivi
对于 MVC Razor 中的简单标签,您更喜欢使用简单的 HTML 还是使用扩展方法例如 Male Or @Html.Label("male", "Male") 我觉得有时使用简单的 HTML
我有一个很奇怪的问题。当我在我的设置- Activity 中滚动时,一些复选框在不再显示时会发生变化。例如:我取消选中广告复选框,然后向下滚动,当复选框完全消失时,复选框会重置。只有当我取消选中默认值
我有一个带有 PreferenceActivity 的 Android 应用程序,其中一个首选项条目启动了我自己的 Activity 之一(“关于”屏幕)。该条目如下所示: 此外(这很重
实现“夜间主题”。我不知道如何更改 ListPreference 的背景颜色。 PreferenceActivity "day" theme PreferenceActivity night them
这个问题在这里已经有了答案: When to use ES6 class based React components vs. functional ES6 React components? (5
我在私有(private)模式下启动了 Firefox 并打开了 youtube。我看到的第一件事是根据我以前的 watch 推荐的视频。但是我没有登录,我处于私有(private)模式,为什么 yo
我试图在偏好 Activity 中展示广告,但它从未出现过。 Logcat 始终显示消息“没有足够的空间来显示广告!想要:,有:” 这就是我制作广告的方式。我对广告有自定义偏好 public clas
我是一名优秀的程序员,十分优秀!