Android 在AAR库中管理SharedReference

Android 在AAR库中管理SharedReference,android,sharedpreferences,android-context,aar,Android,Sharedpreferences,Android Context,Aar,我正在建一个AAR图书馆。因为我的库中有一个复杂的设置。我希望能帮助用户使用这个库可以轻松地设置/记住他们的设置。因此,我试图让我的AAR库为用户管理SharedReference 例如,下面是我的项目的结构 AppAAA (dependent on LibBBB) | - MainActivity LibBBB | - LibSetting | - LibSettingFragment | - LibSettingActivity | - ... - preferences.xml 我尝试

我正在建一个AAR图书馆。因为我的库中有一个复杂的设置。我希望能帮助用户使用这个库可以轻松地设置/记住他们的设置。因此,我试图让我的AAR库为用户管理SharedReference

例如,下面是我的项目的结构

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)

然而,它不起作用。libsetingfragment设置的首选项完全没有传播到pref.getXXX()加载的首选项

我的猜测是因为libsetingfragment无法知道我想从“应用程序的上下文”而不是lib的上下文设置首选项。我怎么做

LibSettingActivity和LibSettingFragment的实现非常简单。我基本上只是调用“addPreferencesFromResource(R.xml.preferences);”来加载要设置的首选项(注意:我在xml中使用相同的键PREF_key_SERVER_PORT)

如果您打算分发此库,我不建议这样做。您的库现在正在污染应用程序的主
共享参考资料

libsetingfragment设置的首选项完全没有传播到pref.getXXX()加载的首选项

这是因为您使用了错误的
SharedReferences
PreferenceFragment
使用应用程序的主
SharedReferences
,通过
PreferenceManager.getDefaultSharedReferences()
检索


在库中使用您自己的“私有”
SharedReferences
是可以的,不过它确实会给某些应用程序(例如,需要控制所有数据存储以进行加密的应用程序)带来一些问题。

Commonware给出了正确的答案。但对于仍想使用应用程序的SharedReference(而不是DefaultSharedReference)的用户,以下黑客将有助于做到这一点:

    @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();
    }

嗨,你说得对!PreferenceFragment中使用的是DeafultSharedPreferences,这将把值放在两个
SharedReferences
中。