我正在建立一个AAR库。由于我的书架中有一个复杂的设置。我希望能帮助用户,使用该库可以轻松地设置/记住他们的设置。因此,我尝试使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无法知道我要从“应用程序的上下文”而不是lib的上下文设置首选项。我该怎么做?
最佳答案
LibSettingActivity和LibSettingFragment的实现很简单。我基本上只是叫“ addPreferencesFromResource(R.xml.preferences);”加载我的偏好设置(注意:我在xml中使用相同的键PREF_KEY_SERVER_PORT)。
如果您打算分发该库,我不建议您这样做。您的媒体库现在正在污染应用程序的主SharedPreferences
。
LibSettingFragment设置的首选项完全不会传播到pref.getXXX()加载的首选项;
那是因为您使用了错误的SharedPreferences
。 PreferenceFragment
使用应用程序的主SharedPreferences
(通过PreferenceManager.getDefaultSharedPreferences()
检索)。
可以在库中使用自己的“私有” SharedPreferences
,尽管它确实对某些应用程序(例如那些需要控制所有数据存储以进行加密的应用程序)带来一些问题。