2016-07-04 25 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