在 AAR 库中管理 sharedPreference
Manage sharedPreference in the AAR library
我正在构建一个 AAR 库。由于我的库中有一个复杂的设置。我希望帮助用户使用这个库可以轻松 set/remember 他们的设置。因此,我尝试让我的 AAR 库为用户管理 sharedPreference。
例如,这是我项目的结构
AppAAA (dependent on LibBBB)
| - MainActivity
LibBBB
| - LibSetting
| - LibSettingFragment
| - LibSettingActivity
| - ... - preferences.xml
我尝试实现类似的东西:
public class LibSetting() {
static final String KEY_SERVER_PORT = "PREF_KEY_SERVER_PORT";
SharedPreferences pref;
Context context;
public LibSetting(Context context) {
this.context = context;
this.pref = ((Activity)context).getPreferences(Context.MODE_PRIVATE);
}
public int getServerPort() {
return pref.getInt("PREF_KEY_SERVER_PORT", 50005);
}
public void showSettingActivity() {
Intent i = new Intent(context.getApplicationContext(), LibSettingActivity.class);
context.startActivity(i);
}
}
LibSettingActivity 和 LibSettingFragment 的实现很简单。我基本上只是调用 "addPreferencesFromResource(R.xml.preferences);" 来加载我的偏好设置(注意:我在 xml 中使用相同的键 PREF_KEY_SERVER_PORT)。
但是,它不起作用。 LibSettingFragment 设置的首选项完全不会传播到 pref.getXXX();
加载的首选项
我的猜测是因为 LibSettingFragment 无法知道我想从 "application's context" 而不是 lib 的上下文中设置首选项。我该怎么做?
The implementation of LibSettingActivity and LibSettingFragment are trivial. I basically just call "addPreferencesFromResource(R.xml.preferences);" to load my preference to set (NOTE: I use the same key, PREF_KEY_SERVER_PORT, in the xml).
如果您打算分发此库,我不推荐这样做。您的图书馆现在正在污染应用程序的主要 SharedPreferences
.
The preference set by the LibSettingFragment is totally not propagated to the preference loaded by pref.getXXX();
那是因为你用错了SharedPreferences
。 PreferenceFragment
使用应用程序的主要 SharedPreferences
,通过 PreferenceManager.getDefaultSharedPreferences()
检索。
在库中使用您自己的 "private" SharedPreferences
是可以的,尽管它确实会给某些应用程序带来一些问题(例如,那些需要控制所有数据存储、进行加密的应用程序)。
CommonsWare 给出了正确的答案。但是对于仍然想使用应用程序的 sharedPreference(而不是 DefaultSharedPreference)的人来说,以下 hack 将有助于这样做:
@Override
public void onResume() {
super.onResume();
// Set up a listener whenever a key changes
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
// Set up a listener whenever a key changes
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// passed as an input argument from the app
appPref.edit().putInt(key, 99999).commit();
}
我正在构建一个 AAR 库。由于我的库中有一个复杂的设置。我希望帮助用户使用这个库可以轻松 set/remember 他们的设置。因此,我尝试让我的 AAR 库为用户管理 sharedPreference。
例如,这是我项目的结构
AppAAA (dependent on LibBBB)
| - MainActivity
LibBBB
| - LibSetting
| - LibSettingFragment
| - LibSettingActivity
| - ... - preferences.xml
我尝试实现类似的东西:
public class LibSetting() {
static final String KEY_SERVER_PORT = "PREF_KEY_SERVER_PORT";
SharedPreferences pref;
Context context;
public LibSetting(Context context) {
this.context = context;
this.pref = ((Activity)context).getPreferences(Context.MODE_PRIVATE);
}
public int getServerPort() {
return pref.getInt("PREF_KEY_SERVER_PORT", 50005);
}
public void showSettingActivity() {
Intent i = new Intent(context.getApplicationContext(), LibSettingActivity.class);
context.startActivity(i);
}
}
LibSettingActivity 和 LibSettingFragment 的实现很简单。我基本上只是调用 "addPreferencesFromResource(R.xml.preferences);" 来加载我的偏好设置(注意:我在 xml 中使用相同的键 PREF_KEY_SERVER_PORT)。
但是,它不起作用。 LibSettingFragment 设置的首选项完全不会传播到 pref.getXXX();
加载的首选项我的猜测是因为 LibSettingFragment 无法知道我想从 "application's context" 而不是 lib 的上下文中设置首选项。我该怎么做?
The implementation of LibSettingActivity and LibSettingFragment are trivial. I basically just call "addPreferencesFromResource(R.xml.preferences);" to load my preference to set (NOTE: I use the same key, PREF_KEY_SERVER_PORT, in the xml).
如果您打算分发此库,我不推荐这样做。您的图书馆现在正在污染应用程序的主要 SharedPreferences
.
The preference set by the LibSettingFragment is totally not propagated to the preference loaded by pref.getXXX();
那是因为你用错了SharedPreferences
。 PreferenceFragment
使用应用程序的主要 SharedPreferences
,通过 PreferenceManager.getDefaultSharedPreferences()
检索。
在库中使用您自己的 "private" SharedPreferences
是可以的,尽管它确实会给某些应用程序带来一些问题(例如,那些需要控制所有数据存储、进行加密的应用程序)。
CommonsWare 给出了正确的答案。但是对于仍然想使用应用程序的 sharedPreference(而不是 DefaultSharedPreference)的人来说,以下 hack 将有助于这样做:
@Override
public void onResume() {
super.onResume();
// Set up a listener whenever a key changes
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
// Set up a listener whenever a key changes
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// passed as an input argument from the app
appPref.edit().putInt(key, 99999).commit();
}