Android:如何在活动A中保存sharedPreferences并在活动B中访问它

时间:2016-01-26 19:45:43

标签: java android android-sharedpreferences

我之前曾经问过这个问题,但是没有提供给我的答案。

所以,我有两个活动:A和B.用户在A中插入一些数据,我希望能够从B(以及将来的更多活动)访问它们。我正在尝试使用共享首选项。现在似乎我的代码能够正确地保存活动A中的数据但是我无法从活动B访问相同的sharedPreference,因为对象(在活动B中)是空的。看起来它创建了另一个具有相同名称的对象。

我对android和java很新,所以我知道这可能只是我不理解这个类是如何工作的,我做错了什么?

活动A

join

活动B

SharedPreferences sharedPref = this.getSharedPreferences("PREF_PERSONAL_DATA",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();

editor.putInt(getString(R.string.n),n);
editor.putInt(getString(R.string.hi), hi);
editor.putInt(getString(R.string.wa), wa);
editor.putInt(getString(R.string.he), he);
editor.putInt(getString(R.string.we), we);
editor.putInt(BlocksNumStr, BlocksNum);
editor.commit();

4 个答案:

答案 0 :(得分:1)

Android提供了对SharedPreferences的三种访问权限:

  1. Activity.getPreferences() - 访问特定于活动的首选项。这仅对您的案例中的ActivityA或ActivityB有效。
  2. 不在活动时
  3. Activity.getSharedPreferences()Context.getSharedPreferences - 访问应用程序级首选项。这些首选项在您的应用程序中随处可见。
    1. PreferenceManager.getDefaultSharedPreferences() - 访问安装在Android上的每个应用程序的全局共享首选项。
  4. 您发布的所有内容似乎都是正确的,因为您使用了getSharedPreferences()。我要检查的事情是:

    1. 确保是否使用来自资源的相同String密钥来检索首选项。
    2. 检查commit()方法是否不会破坏编写批量首选项。就个人而言,我在使用commit()方法时遇到了一些不存储首选项的问题。从Android Honeycomb有一个apply()方法。 commit()apply()之间的区别在于commit()保存了您所处的任何线程的首选项,而apply()异步工作。如果您不依赖于Honeycomb之前的版本,请考虑使用apply()

答案 1 :(得分:0)

A正在存储int值,但B正在尝试将其检索为String - 这会导致SharedPreferences.getString()抛出{ {1}}。我猜测你的第二个代码片段被一个正在捕获此异常的try / catch包围。

您必须使用SharedPreferences.getInt()检索ClassCastException

答案 2 :(得分:0)

确保使用相同的共享首选项实例的最安全方法是调用

getDefaultSharedPreferences(Context context)

首先将这些添加到您的两个活动A和B

私有SharedPreference mSharedPreference; private SharedPreference.Editor mEditor;

在onCreate中启动它们:

mSharedPreference = PreferenceManager.getDefaultSharedPreferences(this);
mEditor = mSharedPreference.edit();
保存到sharedPreference的

执行:

mEditor.put("KEY",variableToSave);
mEditor.apply();

阅读(活动B): //读取以前保存的字符串(例如......)

String readVariable = mSharedPreferences.getString("KEY","DEAULT_VALUE");

使用默认的共享首选项可以访问整个应用中的文件。因此,您可以使用编辑器随处访问您保存的变量(在活动A或B中);

答案 3 :(得分:0)

活动A:

SharedPreferences sharedPref =     getBaseContext().getSharedPreferences("PREF_PERSONAL_DATA",getBaseContext().MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();

editor.putInt(getString(R.string.n),n);
editor.putInt(getString(R.string.hi), hi);
editor.putInt(getString(R.string.wa), wa);
editor.putInt(getString(R.string.he), he);
editor.putInt(getString(R.string.we), we);
editor.putInt(BlocksNumStr, BlocksNum);
editor.commit();

活动B:

SharedPreferences sharedPref = getBaseContext().getSharedPreferences("PREF_PERSONAL_DATA", getBaseContext().MODE_PRIVATE);

String Weight = sharedPref.getString(getString(R.string.wa), null);
int W = sharedPref.getInt("weight", 0);

TextView ShowWeight = (TextView) findViewById(R.id.attempt);
ShowWeight.setText(Weight);
TextView ShowW = (TextView) findViewById(R.id.attemptW);
ShowW.setText(W);