Domanda Android FragmentTransaction commit When?


Sto costruendo un'app per tablet. In questa app c'è un'attività con due frammenti. Il primo frammento è un frammento di elenco "noto" che mostra un semplice elenco di layout di un elemento da una query di database, mentre il secondo frammento mostra i dettagli sul record selezionato (dal frammento di elenco). Il secondo con il secondo frammento è che il suo tipo dipende dai record mostrati nell'elenco. Ad esempio se i record sono clienti, vengono mostrati i dettagli del cliente selezionato, se si tratta di articoli di inventario, vengono mostrati i dettagli dell'articolo selezionato ecc. Per comunicare con il frammento di dettagli ho creato un'interfaccia che implementa ogni classe di frammenti di dettaglio. Il frammento di lista è "fissato" nell'attività dal layout xml. Il frammento di dettaglio tuttavia viene creato durante la creazione dell'attività in questo modo:

super.onCreate(savedInstanceState);
setContentView(R.layout.act_hlpfiles_host);

...

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.laydetailsfragment, FragmentsPool.getHelperFileFragment(501), "recordDetails");
fragmentTransaction.commit();

myDetailsFragment = getFragmentManager().findFragmentByTag("recordDetails");

...

myListFragment = (frg_hlpfiles_lstrecords) getFragmentManager().findFragmentById(R.id.frg_lstrecords);

....
}

Il problema con questo codice è che myDetailsFragment è sempre nullo. Questo perché il frammentTransaction.commit () non viene eseguito immediatamente ma si verifica sul thread principale la prossima volta che quel thread è pronto (come afferma la documentazione di Android).

Se creo il frammento di dettaglio in onStart () e istanzio il frammento di lista su onCreate, tutto funziona correttamente.

Quindi la domanda è: come posso essere sicuro che il frammentTransaction.commit () abbia eseguito il commit della transazione in modo da poter lavorare con il frammento aggiunto? Inoltre c'è un modo per aspettare fino a quando il commit si verifica e poi continuare con il resto del codice?


44
2017-08-30 16:24


origine


risposte:


Prova a correre fragmentManager.executePendingTransactions() dopo aver eseguito la transazione, ma prima di trovare per tag e vedere se funziona per te.


102
2017-08-30 23:09



In Android API 24 FragmentTransaction ha sincrono .commitNow() metodo. È nel riferimento ora: https://developer.android.com/reference/android/app/FragmentTransaction.html#commitNow ()

Anzi, .commit() funziona in modo asincrono Pianifica solo un commit della transazione.


5
2018-03-12 08:02



" ....quindi posso fare un po 'di lavoro con il frammento aggiunto? Inoltre c'è un modo per aspettare fino a quando il commit avviene e quindi continua con il resto del codice?"

Tutto dipende da che lavoro vuoi fare. Dalla tua domanda vedo che la maggior parte del tuo codice di lavoro dovrebbe essere comunque nel codice del frammento, ad esempio quando viene selezionato un articolo di inventario.

Nella richiamata quando viene selezionato un elemento della lista di selezione (per cambiare il frammento di dettagli) sarete comunque in grado di ottenere il frammento di dettagli in modo abbastanza confortevole.

Inoltre, hai già il frammento del ritorno di FragmentsPool.getHelperFileFragment(501), quindi non vedo perché è necessario ottenere il frammento tramite il suo tag.

Sono interessato a sapere in quale lavoro devi lavorare onCreate con il tuo frammento di dettagli aggiunti.


0
2017-08-31 15:13