2016-07-04 40 views
0

改变监听器,我有以下为我onCreateView我的片段sharedPreferences片段中没有发射

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

在使用该片段的喜好被编辑值通过Web服务调用抓住了活动。这就是我使用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的值并设置它们。然后这应该被捕获到片段本身中,然后调用另一种方法。出于某种原因,听众没有检测到这些变化。

当我输出在烤面包信息中编辑的偏好时,我得到的是不正确的值,当我回去并重新输入活动时它具有正确的值时,这告诉我它在创建片段后正在更新,但是由于某种原因,听众不会射击。

+0

您可以在您尝试更改SharedPreferences值的位置添加代码吗? – pablobu

+0

@pablobu补充。首选项在使用片段的活动中更新 – AlexF11

回答

0

根据Android的documentation

注意:偏好管理目前不存储强烈 参考监听器。您必须存储对 侦听器的强烈参考,否则它将容易被垃圾收集。我们 建议您在实例数据 中保留对侦听器的引用,只要您需要侦听器,该对象就会存在。

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

+0

当我在添加侦听器之后直接更新首选项时,会激发它。当我在添加侦听器之前直接输出首选项值时,它会捕获旧值。这会解释这种行为吗? – AlexF11

+0

这听起来像你的变量正在被删除,因为参考偏好管理器与监听器的类型。将侦听器保存到片段的实例变量中应该修复它。 – pablobu

+0

这样做,它现在抓住了正确的价值 – AlexF11