2012-03-07 15 views
23

So che quando si crea un'istanza iniziale di un frammento è possibile passare argomenti utilizzando setArguments(Bundle) e recuperarli nel frammento utilizzando .È possibile passare argomenti a un frammento dopo che è stato aggiunto a un'attività?

Tuttavia, nella mia app ho frammenti che verranno staccati e attaccati più volte dopo essere stati aggiunti a un'attività. Al momento della ricollegamento, potrebbe essere necessario passare un argomento a un frammento per modificarne il contenuto prima di ricollegarlo. Posso usare setArguments la prima volta che visualizzo il frammento, ma nelle occasioni successive non funzionerà. Il savedInstanceState non funzionerà in questo caso poiché non conoscerò il valore dell'argomento prima di scollegare il frammento.

So che potrei semplicemente implementare un metodo che chiamerei prima di collegare il frammento che avrebbe impostato un argomento, ma sembra proprio che questo sia qualcosa che potrebbe già essere presente nell'API e io non lo vedo.

C'è qualcosa di incorporato che mi consenta di farlo o dovrò implementarlo da solo? Per la cronaca, sto usando il pacchetto di supporto (v4).

Grazie mille!

+0

Cosa intendi per riattaccare? I frammenti verranno associati a un'attività solo una volta (AFAIK) e se viene staccato dall'attività viene distrutto. Intendi quando l'utente preme il pulsante Indietro, il frammento viene restituito al layout? – 500865

risposta

12

Si può semplicemente esporre un metodo sul proprio frammento che imposta ciò che si vuole passare ad esso. Per chiamarlo puoi, ad es. recupera il frammento dal backstack per tag o tieni un riferimento di istanza in giro da dove lo chiami.

Questo funziona bene per me anche se è necessario essere difensivi in ​​termini di verifiche Null e così come consapevole del ciclo di vita che il frammento attraversa quando viene collegato o riavviato.

Da quello che posso dire non c'è nulla nel API ...

Aggiornamento: Questo è ancora vero e funziona bene. Ho scoperto che una volta che questo è più complesso è molto più pulito e più facile da usare qualcosa come il bus degli eventi Otto. Imho altamente consigliato.

+0

L'argomento che sto passando è piuttosto banale: non è in realtà un contenuto che verrà aggiunto al frammento ma il frammento mostrerà/nasconderà il contenuto in base al suo valore. Sembrava quasi un po 'troppo semplice, il che mi ha fatto pensare che forse c'era un'API per quello che stavo facendo. Non indovinare. Grazie per l'aiuto! –

2

È possibile passare argomenti a un frammento dopo che è stato aggiunto a un'attività?

No.


Ma se siete alla ricerca di modi per comunicare con l'attività a cui un frammento è legato, è possibile farlo nel modo @manfred ha menzionato o altri modi descritti nel Documentation

C'è un altro modo interessante per comunicare tra loro due frammenti. Vale a dire utilizzando i metodi setTargetFragment e getTargetFragment. Qui, se fragmentB possono influenzare fragmentA, sarà setTargetFragment di fragmentB per fragmentA e quando cambia deve essere aggiornato a fragmentA da dentro fragmentB, si otterrà un riferimento ad esso ((fragmentA) getTargetFragment()) e accedere al metodo di fragmentA per aggiornarlo.

Spero che aiuti. In bocca al lupo.

+0

non sta chiedendo di comunicare con frammento, sta chiedendo come cambiare gli argomenti una volta impostato su frammento –

+0

Il tuo "no" è molto fuorviante e scorretto, la risposta alla domanda OPs, che hai anche citato, viene risposto perfettamente da @ user3978046 sopra –

19

Sì, se è stato chiamato setArguments (bundle) prima che il frammento diventi attivo. Quindi il tuo frammento da lì dopo ha un pacchetto che puoi aggiornare.Per evitare il problema è necessario aggiornare il pacchetto originale e non è necessario richiamare setArguments una seconda volta. Quindi, dopo la costruzione frammento iniziale, modificare i parametri di frammento con codice come

frg.getArguments().putString("someKey", "someValue"); 

Gli argomenti saranno poi essere disponibile nel frammento e sarà persistito e restaurato durante i cambi di orientamento e così via.

Nota questo metodo è utile anche quando il frammento viene creato tramite xml in un layout. Normalmente non si sarebbe in grado di impostare argomenti su tale frammento; il modo per evitare questa restrizione è quello di creare un costruttore alcun argomento che crea il fascio argomento in questo modo:

public MyFragment() { 
    this.setArguments(new Bundle()); 
} 

tardi da qualche parte nel metodo onCreate della vostra attività si sarebbe poi fare:

FragmentManager mgr = this.getSupportFragmentManager(); 
Fragment frg = mgr.findFragmentById(R.id.gl_frgMyFragment); 
Bundle bdl = frg.getArguments(); 
bdl.putSerializable(MyFragment.ATTR_SOMEATTR, someData); 

Questa dei dati dei luoghi nel bundle di argomenti, che sarà quindi disponibile per il codice nel tuo frammento.

+0

Ya, ma c'è un modo per far sì che il tuo frammento si accorga che hai aggiunto argomenti al pacchetto? Suppongo che potrei aggiungere gli argomenti e quindi esporre un metodo sul frammento che l'attività può chiamare per costringerlo a ricontrollare gli argomenti. Il problema è che l'attività non sa in quale fase del ciclo di vita si trova il frammento. – Glaucus

Problemi correlati