sharedPreferences更改片段中的侦听器而不触发

时间:2016-07-04 15:09:40

标签: android android-fragments sharedpreferences

我有以下作为myCreateView for my fragment

public static final String sharedPreferences = "crmPrefFiles";

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View layout=inflater.inflate(R.layout.fragment_item_fragment1, container, false);
        SharedPreferences prefs = getActivity().getSharedPreferences(sharedPrefefrences, 0);
        SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {

                populatePage(layout);
            }
        };
        prefs.registerOnSharedPreferenceChangeListener(listener);
        return layout;
    }

在使用片段的活动中,首选项获取编辑的值通过webservice调用获取。这就是我使用onchangeListener的原因。片段是在编辑首选项之前创建的。

final SharedPreferences settings = getSharedPreferences(sharedPreferences, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("FRAG_" + pageNum, record.getString("group"));
editor.commit(); //commit the changes

现在看来,问题与侦听器没有检测到创建片段本身的活动所做的更改有关。

托管片段的活动获取sharedpreferences的值并设置它们。然后应该将其捕获在片段本身中,然后调用另一个方法。由于某些原因,听众没有检测到这些变化。

当我输出在toast消息中编辑的首选项时,我得到的值不正确,当我返回并重新输入活动时它具有正确的值时,这告诉我在创建片段后它正在更新但是听众没有解雇的原因。

1 个答案:

答案 0 :(得分:0)

根据Android documentation

  

警告:首选项管理器当前不存储强项   对听众的引用。您必须存储一个强引用   听众,或者它很容易被垃圾收集。我们   建议你在实例数据中保留对监听器的引用   只要你需要监听器就会存在的对象。

将侦听器存储到实例变量中可以解决您的问题。还要确保在从Web服务调用获取数据之前添加侦听器。