我有一个“活动a”,它会从SharedPreferences
读取一些值并在TextView
中显示,然后我调用“活动b”,其中来自SharedPreferences
的值得到更新并写回SharedPreferences
。最后,我按回按钮返回“活动a”,现在应该从SharedPreferences
读取新的(更新的)值并显示在TextView
中。但问题出现了,刚从SharedPreferences
读取的值仍然没有更新(不是活动b设置的新值)(从logcat输出得到),怎么回事? SharedPrefs
是否需要某种手动刷新?
如果我重新启动“活动a”,一切正常,新值正确显示。怎么了?
我调用该方法阅读并在“活动a”中显示onResume()
的值。
我还尝试重新实例化SharedPrefs-Object(使用getSharedPreferences()
),但它也无济于事。
提前致谢!
答案 0 :(得分:1)
SharedPreferences
不适用于在活动之间共享数据
使用Intent
和Activity.startActivityForResult
。在这里看到我的答案
Get the intent object in an activity
答案 1 :(得分:1)
您是否在活动b中调用commit()方法来保存新值。
例如:
SharedPreferences customSharedPreference = getSharedPreferences("abcprefs", 0);
SharedPreferences.Editor editor = customSharedPreference.edit();
editor.putString("key", "val");
editor.commit();
其次,你可以在发送到活动b之前完成()活动a,然后从活动b中创建一个新的活动实例a,并调用onCreate()。
或者,您可以刷新onStart()中的首选项,因为您的活动可能已经不再可见了#34;发送到活动b。
请参阅http://developer.android.com/guide/topics/fundamentals/activities.html以查看活动生命周期。
答案 2 :(得分:0)
确保在每项活动中使用相同的首选项:如果您使用getSharedPreferences
,则应指定文件和访问级别。在你的情况下,听起来像是getDefaultSharedPreferences
。
此外,请确保您不仅要设置首选项,还要提交更改:
SharedPreferences preferences = getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("key", "value");
editor.commit();
然后在你的其他活动中:
SharedPreferences preferences = getDefaultSharedPreferences(this);
boolean myPreference = preferences.getBoolean("key", defaultValue);
如果您要发布有问题的代码,这将更容易帮助;如果您仍然无法使其正常工作,我会尝试将其添加到您的帖子中。
答案 3 :(得分:0)
同样值得注意的是,每次调用preference.edit()都会返回一个不同的SharedPreferences.Editor
,因此将编辑器存储到一个单独的变量中很重要,用它来写出首选项,然后提交编辑。例如。这不起作用:
myPrefs.edit().putInt("pref", 1);
myPrefs.edit().putBoolean("pref", true);
myPrefs.edit().commit();
需要(如已经证明的那样):
SharedPreferences myPrefs = getSharedPreferences("pref_name", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = myPrefs.edit();
editor.putInt("pref", 1);
editor.putBoolean("pref", true);
editor.commit();
答案 4 :(得分:0)
要能够使用从活动B发送到SharedPreferences的数据来更新您的活动A,同时又从B恢复活动A,请执行以下操作:
在您的应用清单中,将活动A“ launchMode”设置为“ standard”
从活动B完成并返回活动A后,将意图标记“ FLAG_ACTIVITY_CLEAR_TOP”添加到意图中,如下所示:
Intent intent = new Intent(activityB.this,activityA.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); finish();
要解释代码,:“ FLAG_ACTIVITY_CLEAR_TOP”检查正在启动的活动A是否已在当前任务中运行,然后将所有其他活动放在顶部,而不是启动该活动的新实例通过onNewIntent方法,销毁它的意图,并将此意图传递到Activity的恢复实例(现在位于顶部)。点击此链接以了解有关android任务和后退堆栈的更多信息:https://blog.mindorks.com/android-task-and-back-stack-review-5017f2c18196
希望这对您有帮助...