2014-06-06 34 views
1

我有兩個片段的活動,兩個片段中只有一個在給定時間顯示,如用戶所確定。這兩個片段都通過廣播接收器訂閱數據。保持片段廣播接收器即使在不在視圖中時也處於活動狀態

活動管理使用片段管理器的replace()方法顯示哪個片段,例如,

getFragmentManager().beginTransaction().replace(R.id.north_fragment, fragment1, FRAGMENT_TAG).commit(); 

該廣播接收機被登記在片段的onCreateView()重寫:如預期的廣播接收機接收相應的數據。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_spectrum_analyzer_graph, container, false); 

    setupGraphView(rootView); 

    // register for Spectrum Frame Response messages 
    myReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.d(TAG, "onReceive()"); 
      // do stuff 
    } 
} 

廣播接收未登記在onDestroyView(),例如:

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    getActivity().unregisterReceiver(m_spectrumDataFrameReceiver); 
} 

有沒有一種方法可以讓我保持片段通過廣播接收器接收數據,即使是不可見的(它已經經過破壞)?我希望接收器繼續獲取數據並將其存儲在片段中,即使片段不可見(但活動可見),但我知道我需要在某個時刻取消註冊廣播接收器。

當活動被銷燬(調用其活動註銷)時應該註銷嗎?還是在這裏太晚?我對Fragment lifecyle的複雜性相當陌生,我不太確定該怎麼做。

+0

您可以將接收器註冊到您的活動中,因爲它始終存在,將數據發送到可見片段,並保留不可見的數據。當你顯示第二個片段時,讓它詢問他的數據的活動。 – ILovemyPoncho

+0

這似乎增加了很多耦合。我覺得像一個片段應該避免知道它所附帶的活動的具體細節,或者它必須從中獲取信息。 –

+0

如何在onCreate()/ onDestroy()上註冊/註銷接收者並將setRetainInstance()設置爲true? – ILovemyPoncho

回答

1

而不是replacing每個片段每次只使用add方法片段事務,因此它在不可見時仍然存在。

解決方案:

更換replace使用add

beginTransaction().add(R.id.north_fragment, fragment1, FRAGMENT_TAG).commit(); 
+0

因此,如果我在已經有一個位置(R.id.north_fragment)的地方添加一個片段,它不會調用onDestroyView(),但是可以適當地調用其他一些片段生命週期方法?在onPause()? onStop()? –

+0

@StealthRabbi是的,它不會破壞,因爲你將它添加到一個片段的頂部, –

+0

當我試圖添加片段時,我收到以下異常。 java.lang.IllegalStateException:已添加片段: 另外,將第二個片段添加到當前所在的第一個片段中,則什麼也不做。我需要使用show()/ hide()嗎? –

1

你應該在活動的onResume註冊您的接收器,並在onPause註銷它。只要活動正在運行,您的接收器就會收到廣播。然後你可以通過任何方式將收到的數據傳遞給相應的片段。

+0

是的,我意識到我在我的片段中註冊接收者的願望並不好,特別是如果所有片段都註冊了相同的東西。我最終採納了你的建議,但我認爲Rod的答案真正回答了我所問的問題。 –

相關問題