Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android FragmentTransaction commit When?

I am building a tablet app. In this app there is one activity with two fragments. First fragment is a "known" list fragment which is showing a simple one item layout list from a database query, the second fragment shows the details about the selected record (from the list fragment). The think with the second fragment is that its type depends from the records being showed in the list. For example if the records are customers then the selected customer's details are shown, if they are inventory items the selected item's details are shown etc. In order to communicate with the Details Fragment I've created an interface which every detail fragment class implements. The list fragment is "fixed" in the activity from the layout xml. The detail fragment however is created during the activity's creation like this:

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);  .... } 

The problem with this code is that myDetailsFragment is always null. This is because the fragmentTransaction.commit() does not run immediately but it happens on the main thread the next time that thread is ready (as the android documentation states).

If I create the detail fragment in onStart() and instantiate the list fragment in onCreate everything works ok.

So the question is: How can I be sure that the fragmentTransaction.commit() has commit the transaction so I can do some work with the added fragment? Furthermore is there any way to wait until the commit happens and then continue with the rest of the code?

like image 956
ChD Computers Avatar asked Aug 30 '11 16:08

ChD Computers


People also ask

What is the difference between commit and commitNow ()?

The former only executes the current transaction synchronously, whereas the latter will execute all of the transactions you have committed and are currently pending. commitNow() prevents you from accidentally executing more transactions than you actually want to execute.

Are fragments deprecated?

This class was deprecated in API level 28. Use the Support Library DialogFragment for consistent behavior across all devices and access to Lifecycle. This class was deprecated in API level 28.

What is the use of addToBackStack in Android?

addToBackStack. Add this transaction to the back stack. This means that the transaction will be remembered after it is committed, and will reverse its operation when later popped off the stack.


2 Answers

Try running fragmentManager.executePendingTransactions() after committing your transaction but before finding by tag and see if that works for you.

like image 161
Mark D Avatar answered Oct 11 '22 22:10

Mark D


In Android API 24 FragmentTransaction has synchronous .commitNow() method. It's in the reference now: https://developer.android.com/reference/android/app/FragmentTransaction.html#commitNow()

On the contrary, .commit() works asynchronously. It just schedules a commit of the transaction.

like image 35
Ostap Andrusiv Avatar answered Oct 11 '22 21:10

Ostap Andrusiv