2014-10-28 43 views
0

我已經實現了這個場景,其中我有一個導航抽屜,其中嵌入的片段被添加到帶有標記的後端堆棧。每個片段具有以下實現的:廣播接收器和片段

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (rootView == null) { 
     rootView = inflater.inflate(R.layout.fragment_feed, container, 
       false); 
     // Doing initialisaion here 
    } else { 
     ((ViewGroup) rootView.getParent()).removeView(rootView); 
    } 
    return rootView; 

這是我能想到的,以保持我的這些片段中的列表和它們的動態頁眉和頁腳(約在這裏實現了一種新方法已經在考慮)的最佳方式。

而且我有這些節目在用戶LOGES了我的應用程序,這樣我刷新這些列表,或當位置的變化:

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
      locationBroadcastReciever, 
      new IntentFilter(UpdateLocationIntentService.LOCATION_CHANGED)); 
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
      significantBroadcastReciever, 
      new IntentFilter(UserDefaultsManager.SIGNIFICANT_CHANGED)); 
    // Further code here 
} 

當片段是分離的,在分離被稱爲:

@Override 
public void onDetach() { 
    super.onDetach(); 
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(
      locationBroadcastReciever); 
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(
      significantBroadcastReciever); 
    // This is also where I cancel any pending request for fetching data 
}; 

這種方式現在正在工作,但我必須檢查請求何時完成是否某些視圖已被銷燬,因爲onDestroyView在我用另一個替換片段時調用,但onDetach因片段處於打開狀態而未被調用回到棧和我ts尚未分離。

當前帶有視圖空指針檢查的實現允許我在用戶註銷(或登錄)或位置發生變化時同時更新4個片段,並且列表中沒有先前的項目。

我相信有更好的方法,但我似乎無法在我嘗試過的其他任何方面獲得相同的結果。

+0

看起來你可以從EventBus – cYrixmorten 2014-10-28 19:17:15

+0

看看,或者你可以嘗試Otto替代EventBus。 – 2014-10-30 13:06:03

+1

謝謝你的建議。我認爲我們沒有走上正軌。事件通過我的片段傳播(這不是問題)。我做了一個更好的解決方法,設置一個標誌,以便片段需要更新,每當onResume被調用時,我會做這個刷新(這樣我不必擔心我的視圖爲空)。 – 2014-10-30 23:34:43

回答

1

我的情況是由我發現MainActivity.The簡單的解決方案主辦的一個片段來更新文本框是這樣的: -

在我的MainActivity類別檢索MainActivtiy.This的運行實例是我MAinActivity

private static MainActivity mainActivityRunningInstance; 
    public static MainActivity getInstace(){ 
     return mainActivityRunningInstance; 
    } 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mainActivityRunningInstance =this; 
---------- 
} 

現在廣播reciever的onRecieve方法,獲取實例並調用Update方法

@Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().matches(Intents.PROVIDER_CHANGED_ACTION)) { 
       String textValue="the text field value"; 
// the null check is for, if the activity is not running or in paused state, in my case the update was required onlyif the main activity is active or paused 
      if(MainActivity.getInstace()!=null) 
       MainActivity.getInstace().updateUI(textValue); 
} 

現在的PA rt我們需要在UIThread中運行更新,MainActivity的updateUI方法將調用片段更新方法。

public void updateUI(final String str) { 
     MainActivity.this.runOnUiThread(new Runnable() { 
      public void run() { 
    //use findFragmentById for fragments defined in XML ((SimpleFragment)getSupportFragmentManager().findFragmentByTag(fragmentTag)).updateUI(str); 
      } 
     }); 
    } 

和最後一步更新片段的文本字段

public void updateUI(String str){ 
     tv_content.setText(str); 
    } 

和賓果遊戲,它的完成。我提到了post來解決我的問題。希望它能幫助別人。