Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing data back to previous fragment from current fragment

Tags:

I am Using Navigation Drawer in my app. I have one MainActivity and rest of are Fragments. So the issue is Suppose i have three fragments like A,B,C.

Now in A i have one button and i am sending data from A>B.
For example putSring("datafrom A","datafrom A");
Now in B i receive data From A.
I have one button in B,and i am sending data from B>C.
For example putSring("datafrom B","datafrom B");
Now in C i receive data From B.
Then, I have one Button in C,and sending data from C>B.
For example putSring("datafrom C","datafrom C");

So,seems like in B i am getting data from two different fragments. I tried with all using activity and it work well with startActivityforresult. but how can i manager when all are fragments.

like image 993
chris Avatar asked Mar 10 '17 06:03

chris


2 Answers

UPDATE

Starting with Androidx Activity 1.2.0-alpha02 and Androidx Fragment 1.3.0-alpha4, the official Android developer guide recommends to use the Activity/Fragment Result APIs over the deprecated Activity.onActivityResult(int, int, Intent) and Fragment.setTargetFragment(Fragment, int) methods:

it is strongly recommended to use the Activity Result APIs introduced in AndroidX Activity 1.2.0-alpha02 and Fragment 1.3.0-alpha02.

Thus, to pass data back to fragment B from C, call setFragmentResultListener() on fragment B's FragmentManager, as shown in the following example:

override fun onCreate(savedInstanceState: Bundle?) {     super.onCreate(savedInstanceState)     // Use the Kotlin extension in the fragment-ktx artifact     setFragmentResultListener("requestKey") { requestKey, 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      } } 

In fragment C, set the result on the same FragmentManager by using the same requestKey using the setFragmentResult() API. Example:

setFragmentResult("requestKey", bundleOf("bundleKey" to "result")) 

More details can be found at this guide.


The below answer is deprecated

You may call setTargetFragment() when you start the Fragment C from B. Example:

FragmentC fragmentC = FragmentC.newInstance(); fragmentC.setTargetFragment(FragmentB.this, REQUEST_CODE); getFragmentManager().beginTransaction().replace(R.id.container, fragmentC).commit(); 

and then when you want to pass data back to fragment B from C, you can call the following code:

getTargetFragment().onActivityResult(                 getTargetRequestCode(),                 Activity.RESULT_OK,                 new Intent().putExtra("datafrom C", "datafrom C") ); 

and get it from the onActivityResult() method in your fragment B:

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) {     if (requestCode==REQUEST_CODE && resultCode==Activity.RESULT_OK) {         String datafromC = data.getStringExtra("datafrom C");        } } 
like image 148
CodePlay Avatar answered Sep 22 '22 13:09

CodePlay


When u are sending the data from Fragment A to Fragment B use the same boolean like below:-

FragmentA -> FragmentB

FragmentB ldf = new FragmentB (); Bundle args = new Bundle(); args.putBoolean("BOOLEAN_VALUE",true); ldf.setArguments(args);  getFragmentManager().beginTransaction().add(R.id.container, ldf).commit(); 

And when u are send data from Fragment C to Fragment B use the same BOOLEAN which is used in Fragment A to B like below-

FragmentC -> FragmentB

FragmentB ldf = new FragmentB ();     Bundle args = new Bundle();     args.putBoolean("BOOLEAN_VALUE",false);     ldf.setArguments(args);      getFragmentManager().beginTransaction().add(R.id.container, ldf).commit(); 

And in the last we have to check that value is recevied in FragmentB is from where like Fragment A OR FragemntC

FragmentB

   Boolean getValue= getArguments().getBoolean("BOOLEAN_VALUE");      if(getValue)    {     //VALUE RECEIVED FROM FRAGMENT A    }    else    {    //VALUE RECEIVED FROM FRAGMENT C    } 
like image 45
Ravindra Kushwaha Avatar answered Sep 21 '22 13:09

Ravindra Kushwaha