2012-06-12 62 views
6

我有一個activity與兩個fragments。我不使用<fragment/>標籤,我有一個擴展Fragment兩類,在該片段,我有:片段和廣播接收器

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.bfragment, container, false); // this will inflate the Fragment in activity. 
    } 

現在的問題是,我在[活動的一些廣播接收機從一些接收器更新從UI第一個片段,一些從第二個更新UI。

一個在我的主要胡亞蓉定義我的廣播接收機的是:

private BroadcastReceiver bcReceived = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context arg0, Intent intent) { 
      Log.d("", "BC Object Received"); 

      ActionBar actionbar = getActionBar(); 
      actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
      ActionBar.Tab bTab = actionbar.newTab().setText("B"); 
      Fragment fragment = new BFragment(); 
      bTab.setTabListener(new MyTabsListener(fragment)); 
      actionbar.addTab(bTab, true); 

      final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.bTable); // Getting null pointer exception here. linearLayout is not getting initialized. 

我想使用上述的LinearLayout並用它來在膨脹它的圖。但獲得NPE。

這裏,當一些廣播接收機更新第一個分段時,它可以正常工作,但是當廣播接收機更新第二個分段時,我得到了NPE。

我的問題是:如何以及應該在哪裏更新片段?它應該在我的活動內嗎?如果是,那麼在哪種方法?如果沒有,那麼我應該在哪裏更新片段?

請幫幫我!!!

+0

這兩個片段的佈局(R.layout.bfragment)是一樣的嗎? R.id.bTable是否存在於這兩個片段中? –

+0

如果你問兩個佈局是否看起來相似,那麼沒有。但是通過替換之前的佈局,兩個佈局都會在相同的容器中膨脹。 – Shrikant

+0

R.id.bTable是你的容器嗎? –

回答

25

你的活動邏輯應該與你的分段邏輯分開。

您的活動應該處理類似的邏輯:

我需要顯示該片段,而不是一個

但是你的活動是應該處理這樣的邏輯:

我需要更新片段內部的內容

片段更新其內容的責任。另一方面,活動可能會告訴片段它需要更新自己。

考慮到這一點,你的片段應該公開的方法,如

updateContent(With Blabla) 

OR

updateContent() 

在您的活動,當BroadcastReceiver收到你應該:

  • 可檢查片段當前顯示
  • 準備要在片段中更新的內容
  • 要求使用updateContent(With Blabla)方法更新片段。

OR

  • 檢查該片段當前顯示
  • 問片段本身與updateContent()方法更新。

根據您的應用程序業務邏輯選擇最簡單的方法。

+0

感謝您的回答TimothéeJeannin。讓我以這種方式實現它。 – Shrikant

+0

沒問題,隨時問問你是否需要更多解釋。祝你的項目好運。 :) –

+0

非常感謝。 – Shrikant