我正在建立一个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()加载的首选项;


那是因为您使用了错误的SharedPreferencesPreferenceFragment使用应用程序的主SharedPreferences(通过PreferenceManager.getDefaultSharedPreferences()检索)。

可以在库中使用自己的“私有” SharedPreferences,尽管它确实对某些应用程序(例如那些需要控制所有数据存储以进行加密的应用程序)带来一些问题。

07-27 13:58