2014-08-28 1 views
5

Le best practice Android per l'interazione frammento-frammento (descritte here e here) impongono allo Activity di implementare un listener definito dal frammento figlio. Activity gestisce quindi la comunicazione tra i frammenti.Interazioni frammento frammento nidificato Android

Dal mio punto di vista questo è quello di mantenere i frammenti liberamente accoppiati l'uno dall'altro. Tuttavia,

  1. È questo anche il caso di frammenti annidati? Posso immaginare che potrebbe avere senso che un frammento annidato riporti direttamente al suo frammento principale anziché all'Attività.

  2. Se un frammento nidificato ha il suo frammento genitore implementa il suo listener, in che modo uno (o uno) dovrebbe richiedere al frammento padre di farlo. In altre parole, è simile al paradigma di seguito ma per Fragments:

    @Override 
    public void onAttach(Activity activity) { 
        super.onAttach(activity); 
    
        try { 
         mCallback = (OnHeadlineSelectedListener) activity; 
        } catch (ClassCastException e) { 
         throw new ClassCastException(activity.toString() 
           + " must implement OnHeadlineSelectedListener"); 
        } 
    } 
    

risposta

1

Finché si definisce un'interfaccia nel frammento, si può avere l'attività genitore o frammento genitore attuazione. Non esiste una regola che affermi che il frammento non debba implementare l'interfaccia di un frammento figlio. Un esempio in cui questo ha senso è che il frammento A ha due figli Frammenti B, C. Un'interfaccia di B implementa, quando A ottiene una richiamata, potrebbe dover aggiornare il frammento C. Esattamente la stessa cosa con l'attività, solo un livello diverso.

+0

tuttavia, il modo descritto nel link di Google pubblicato nella domanda incoraggia/impone di essere un 'Activity' allegando il listener utilizzando il' onAttach() 'del frammento e lanciando un errore in caso contrario. – bcorso

+0

Il documento incoraggia questo frammento a non comunicare direttamente con un altro frammento. Non che debba essere un'attività. – CChi

+1

C'è un motivo particolare per cui Google suggerisce di lanciare un 'Eccezione' se il listener non è implementato dall''attività '. Dovrei semplicemente rimuovere quel codice? – bcorso

0

È possibile implementare lo stesso modello per le interazioni bambino/genitore utilizzando getParentFragment(). Il frammento genitore fa riferimento a qualsiasi frammento che questo ha aggiunto tramite il suo ChildFragmentManager. Se questo frammento è collegato direttamente a un'attività, questo metodo restituisce null.

4

se qualcuno voleva un esempio di un'implementazione che assicura contesto genitore implementa i callback mentre senza preoccuparsi se si tratta di un'attività o di un frammento, i seguenti ha lavorato per me:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof Callbacks) { 
     mCallbacks = (Callbacks) context; 
    } else { 
     if (getParentFragment() != null && getParentFragment() instanceof Callbacks) { 
      mCallbacks = (Callbacks) getParentFragment(); 
     } else { 
      throw new RuntimeException(context.toString() 
        + " must implement " + TAG + ".Callbacks"); 
     } 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    mCallbacks = null; 
} 

Enjoy!