gpt4 book ai didi

Android 一种为一个/所有偏好触发 onSharedPreferenceChange() 的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:13 25 4
gpt4 key购买 nike

  1. 我通过读取文本文件并解析它来加载一组新设置。
  2. 对于在那里找到的每个设置,我都提取值并更新相应的首选项(无论是 CheckPreference、ListPreference 还是 EditTextPreference)。
  3. 所有这些都是从设置 fragment 中完成的。这意味着在我进行更改时可以看到首选项屏幕。
  4. 因为我以编程方式更改值 (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);

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

关于Android 一种为一个/所有偏好触发 onSharedPreferenceChange() 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14924451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com