recente ho iniziato a utilizzare i frammenti hanno creato un'applicazione demo che assomiglia a questo:Come salvare e riutilizzare la stessa istanza di frammenti?
Cliccando su ogni pulsante si alterna tra frammento 1, Frammento 2, e 3. Frammento
Quello che sono cercare di ottenere è di avere solo 1 istanza di ciascun frammento e riutilizzarla. (Si noti che tutti i frammenti sono creati e aggiunti dinamicamente). Attualmente sto facendo questo creando una HashMap di frammenti e inserendo ogni istanza e afferrandola da lì.
Quindi le mie domande sono: C'è un modo migliore per farlo: utilizzando il metodo putFragment (...) di FragmentManager? putFragment (Bundle bundle, String key, Fragment fragment)
Non riesco a capire come usarlo nel mio caso. Se qualcuno può darmi un esempio di come usare questo metodo.
È costoso mantenere un riferimento di ogni frammento nella mia attività? Questo mantiene tutti i frammenti vivi? Sto usando un riferimento morbido per affrontare questo, ma non sono sicuro se questo è il modo corretto di farlo. Per favore indicami un modo alternativo per farlo o fammi sapere se questo è il modo migliore per farlo.
Grazie in anticipo.
Ecco il mio codice:
UPDATE: Sto cercando di riutilizzare frammenti dalla pila di nuovo, cercando di aggiungere solo loro se non esiste nella pila avanti. Il codice qui sotto mi dà l'eccezione di Stato illegali dopo a navigare lontano dal frammento di una -> tornano ad esso -> quindi provare a premere il pulsante indietro:
10-28 13:21:40.255: ERROR/MessageQueue-JNI(3548): java.lang.IllegalStateException: Fragment already added: FragmentOne{423db570 #0 id=0x7f050006 fragOne}
public class MainActivity extends Activity implements View.OnClickListener {
private Button btnOne;
private Button btnTwo;
private Button btnThree;
/* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initialize();
if(findViewById(R.id.fl) != null){
if(savedInstanceState != null)
return;
}
FragmentManager.enableDebugLogging(true);
updateView("fragOne");
}
private void initialize(){
btnOne = (Button) findViewById(R.id.button1);
btnTwo = (Button) findViewById(R.id.button2);
btnThree = (Button) findViewById(R.id.button3);
btnOne.setOnClickListener(this);
btnTwo.setOnClickListener(this);
btnThree.setOnClickListener(this);
fragHolder = new HashMap<String, SoftReference<Fragment>>();
}
private void updateView(String tag){
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment frag = getFragmentManager().findFragmentByTag(tag);
boolean addToStack = true;
if(frag == null){
if(tag.equals("fragOne"))
frag = new FragmentOne();
else if(tag.equals("fragTwo"))
frag = new FragmentTwo();
else if(tag.equals("fragThree"))
frag = new FragmentThree();
}else{
//Don't add to back stack
addToStack = false;
}
ft.replace(R.id.fl, frag, tag);
if(addToStack)
ft.addToBackStack(null);
ft.commit();
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.button1:
updateView("fragOne");
break;
case R.id.button2:
updateView("fragTwo");
break;
case R.id.button3:
updateView("fragThree");
break;
}
}
}
Hai esaminato FragmentTransactions? Possono esserti utili. –