Risposte:
Non è possibile impostare l'ID di un frammento a livello di codice .
Tuttavia, esiste un String tag
elemento che puoi impostare all'interno di FragmentTransaction che può essere utilizzato per identificare in modo univoco un frammento.
Come Aleksey ha sottolineato, è possibile passare un ID di FragmentTransaction
's add(int, Fragment)
metodo. Tuttavia, questo non specifica l'ID per un frammento. Specifica l'ID di a ViewGroup
in cui inserire il file Fragment
. Questo non è così utile per lo scopo che mi aspetto tu abbia, perché non identifica in modo univoco Fragment
s, ma ViewGroup
s. Questi ID sono contenitori a cui uno o più frammenti possono essere aggiunti dinamicamente. L'utilizzo di un tale metodo per identificare Fragment
i messaggi di posta elettronica richiederebbe di aggiungere ViewGroup
dinamicamente messaggi di posta elettronica al layout per ogni Fragment
inserimento. Sarebbe piuttosto macchinoso.
Quindi, se la vostra domanda è come creare un identificatore univoco per un frammento si sta aggiungendo in modo dinamico, la risposta è quella di utilizzare FragmentTransaction
's add (int containerViewId, Fragment frammento, tag String) metodo e FragmentManager
' s findFragmentByTag (String) metodo.
In una delle mie app, sono stato costretto a generare stringhe in modo dinamico. Tuttavia, non è così costoso rispetto all'effettiva FragmentTransaction.
Un altro vantaggio del metodo tag è che può identificare un frammento che non viene aggiunto all'interfaccia utente. Vedere il metodo add (Fragment, String) di FragmentTransaction . Fragment
non è necessario avere View
s! Possono anche essere usati per mantenere uno stato temporaneo tra le modifiche alla configurazione!
Risulta che potresti non aver bisogno di conoscere l'id del frammento.
Dai documenti:
public abstract Fragment findFragmentById (int id)
Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.
La parte importante è "come ID contenitore quando aggiunto in una transazione".
così:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_holder, new AwesomeFragment())
.commit();
e poi
AwesomeFragment awesome = (AwesomeFragment)
getSupportFragmentManager()
.findFragmentById(R.id.fragment_holder);
ti darà qualunque (fantastico) frammento contenuto in R.id.fragment_holder.
Nella maggior parte dei casi puoi utilizzare il tag fragment oltre che l'ID.
Puoi impostare il valore del tag in FragmentTransaction.add(Fragment fragment, String tag );
. Quindi puoi usare il comando FragmentManager.findFragmentByTag(String tab)
per trovare il frammento in questione.
Come hanno già menzionato Tom e altri, ci sono modi per mettere un tag su un frammento e usare quel tag per l'identificazione. Un problema successivo che ho riscontrato con queste soluzioni è che il frammento non riceve un tag finché non è associato all'attività (o, in realtà, al FragmentManager
). Cosa fare se è necessario identificare un frammento prima che sia stato etichettato?
Le mie soluzioni finora si basano tutte sul trucco (Java) più antico del mondo: creare un frammento di template minimalista che prende un id in uno dei suoi costruttori e fornisce un getFragmentId()
metodo che restituisce quell'id. Poi ho lasciato che quei frammenti che richiedono un'identificazione precoce estendano quel modello e; Ecco! Problema risolto.
Questa soluzione potrebbe, sfortunatamente, richiedere una serie di frammenti di template, uno per ogni tipo di frammento ListFragment
, DialogFragment
o semplicemente vecchi Fragment
(POFO ?!) che richiedono un'identificazione precoce. Ma questo è gestibile nel caso di frammenti credo, considerando i guadagni forniti.
Scusa per aver strappato le ferite in via di guarigione :-)
Saluti!
Utilizza il seguente:
Per aggiungere un frammento:
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();
Per identificare il frammento esistente:
getFragmentManager().findFragmentByTag(fragmentName);
Quando si utilizza un tag, assicurarsi di aggiungere il file
fragmentTransaction.addToBackStack(null);
in modo che il frammento venga ripristinato anziché distrutto come indicato nelle guide per gli sviluppatori.
Se non chiami addToBackStack () quando esegui una transazione che rimuove un frammento, quel frammento viene distrutto quando viene eseguito il commit della transazione e l'utente non può tornare ad esso. Considerando che, se chiami addToBackStack () durante la rimozione di un frammento, il frammento viene interrotto e viene successivamente ripreso se l'utente torna indietro.
Puoi trovarlo alla fine di questa pagina .
Ho perso circa 30 minuti cercando di capire perché il mio frammento non veniva trovato tramite una semplice findFragmentByTag();
chiamata