2012-06-12 12 views
6

Ho un activity con due fragments. Non sto usando <fragment/> tag, ho due classi che si estende Fragment, in quel frammento, ho:Fragments and Broadcast Receivers

@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. 
    } 

Ora il problema è, sto ricevendo alcune riceventi per la radiodiffusione in attività da cui alcuni ricevitori aggiornare l'interfaccia utente da primo frammento e alcuni aggiornamenti l'interfaccia utente dal 2 °.

Un mio ricevitore trasmissione definita nel mio acitivity principale è:

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. 

voglio usare il LinearLayout sopra e utilizzarlo per gonfiare una vista in esso. Ma ottenere NPE.

Qui, quando alcuni ricevitori broadcast aggiornano il primo frammento, funziona correttamente, ma quando un ricevitore broadcast aggiorna il 2 ° frammento dall'attività, ottengo NPE.

La mia domanda è: Come e dove devo aggiornare il frammento? Dovrebbe essere nella mia attività? se sì allora in quale metodo? se no, dove devo aggiornare il frammento?

Per favore aiutatemi !!!

+0

Il layout (R.layout.bfragment) è lo stesso per i due frammenti? R.id.bTable è presente in entrambi i frammenti o no? –

+0

se stai chiedendo se entrambi i layout sembrano simili allora no. Ma entrambi i layout vengono gonfiati nello stesso contenitore sostituendo il layout precedente. – Shrikant

+0

R.id.bTable è il tuo contenitore giusto? –

risposta

25

La logica di attività deve essere separata dalla logica dei frammenti.

si suppone La vostra attività per gestire la logica del tipo:

ho bisogno di visualizzare questo frammento, invece di quella

Ma la vostra attività non è dovrebbe gestire questo tipo di logica :

ho bisogno di aggiornare quello che c'è dentro il frammento

È responsabilità del frammento aggiornare il suo contenuto. D'altra parte, l'attività potrebbe indicare al frammento che è necessario aggiornarsi.

Con che i metodi in mente, i tuoi frammenti dovrebbero esporre come

updateContent(With Blabla) 

O

updateContent() 

Nella vostra attività, quando il BroadcastReceiver riceve qualcosa che si dovrebbe:

  • Verificare quali il frammento è attualmente visualizzato
  • Preparare il contenuto da aggiornare nel frammento
  • Chiedere al frammento di aggiornarsi con il metodo updateContent(With Blabla).

O

  • Controllare quale frammento attualmente visualizzata
  • Fai il frammento di aggiornarsi con il metodo updateContent().

Scegliere il metodo più semplice in base alla logica di business dell'applicazione.

+0

Grazie per la risposta, Timothée Jeannin. Consentitemi di implementarlo in questo modo. – Shrikant

+0

Nessun problema, sentitevi liberi di chiedere se avete bisogno di ulteriori spiegazioni. Buona fortuna con il vostro progetto. :) –

+0

Grazie mille. – Shrikant