【问题标题】:Manage sharedPreference in the AAR library管理 AAR 库中的 sharedPreference
【发布时间】:2017-09-30 21:37:09
【问题描述】:

我正在构建一个 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 的上下文设置首选项。我该怎么做?

【问题讨论】:

    标签: android sharedpreferences android-context aar


    【解决方案1】:

    LibSettingActivity 和 LibSettingFragment 的实现是微不足道的。我基本上只是调用“addPreferencesFromResource(R.xml.preferences);”加载我的偏好设置(注意:我在 xml 中使用相同的密钥 PREF_KEY_SERVER_PORT)。

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

    LibSettingFragment 设置的首选项完全不会传播到 pref.getXXX() 加载的首选项;

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

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

    【讨论】:

    • 嗨,你是对的! PreferenceFragment 中使用的是 DeafultSharedPreference
    【解决方案2】:

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

    【讨论】:

    • 这会将值放入 both SharedPreferences.
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2016-07-10
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2012-07-07
    相关资源
    最近更新 更多