Is there a method that works like start fragment for result?
All of the Fragments live inside Activities. Starting a Fragment for a result doesn't make much sense, because the Activity that houses it always has access to it, and vice versa. If the Fragment needs to pass on a result, it can access its Activity and set its result and finish it. In the case of swapping Fragments in a single Activity, well the Activity is still accessible by both Fragments, and all your message passing can simply go through the Activity.
Just remember that you always have communication between a Fragment and its Activity. Starting for and finishing with a result is the mechanism for communication between Activities - The Activities can then delegate any necessary information to their Fragments.
If you wish, there are some methods for communication between Fragments,
setTargetFragment(Fragment fragment, int requestCode)getTargetFragment()getTargetRequestCode()
You can callback using these.
Fragment invoker = getTargetFragment();if(invoker != null) { invoker.callPublicMethod();}
Recently, Google has just added a new ability to FragmentManager
which made the FragmentManager
be able to act as a central store for fragment results. We can pass the data back and forth between Fragments easily.
You can out the blog post that I've made https://oozou.com/blog/starting-a-fragment-for-results-in-android-46
Starting fragment.
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Use the Kotlin extension in the fragment-ktx artifact setResultListener("requestKey") { key, bundle -> // We use a String here, but any type that can be put in a Bundle is supported val result = bundle.getString("bundleKey") // Do something with the result... }}
A Fragment that we want the result back.
button.setOnClickListener { val result = "result" // Use the Kotlin extension in the fragment-ktx artifact setResult("requestKey", bundleOf("bundleKey" to result))}
The snippet is taken from Google's official documents.https://developer.android.com/training/basics/fragments/pass-data-between#kotlin
At the date of this answer written, this feature is still in alpha
state. You can try it out using this dependency.
androidx.fragment:fragment:1.3.0-alpha05