3

I have been over 2 references and tried my best to understand the communication between 2 fragments. With the help from a previous question on here + the 2 references I was able to come up with this code. What would I have to put in my FragB to retrieve the choice the user made in ListFragment FragA?

Main Activity:

public class MainActivity extends Activity implements OnDataPass{
...

@Override
public void onDataPass(String data) {
    // TODO Auto-generated method stub

    FragA transaction1 = ((FragA) getFragmentManager().findFragmentByTag("ItemRoleList"));
    transaction1.dataPasser.onDataPass(data);

}

}

Here is FragA:

public class FragA extends ListFragment{

OnDataPass dataPasser;

public interface OnDataPass{
    public void onDataPass(String data);
}

@Override
public void onAttach(Activity a) {
    super.onAttach(a);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        dataPasser = (OnDataPass) a;
    } catch (ClassCastException e) {
        throw new ClassCastException(a.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}
JoeyL
  • 1,295
  • 7
  • 28
  • 50

2 Answers2

2

Here is what i understood. You have tow fragments(A, B) in an activity. A is a list fragment. on selecting an item in A, you have to pass a String to B.

First override onListItemClick() in your Fragment A

FragemtA:

public class FragmentA extends ListFragment{
    ...

    void onListItemClick(ListView l, View v, int position, long id){
        datapasser.onDatapass(data)//here pass the String
    }
}

In your activity's onDataPass method:

void onDataPass(String data){
    FragmentB dataUser = getFragmentB();//Your FragmentB object
    dataUser.use(data);
}

Fragment B:

public class FragmentB extends Fragment{
    ...

    void use(String data){
        //here use the data
    }
}
sujith
  • 2,421
  • 2
  • 17
  • 26
  • So when is void use(String data) accessed? is it before or after onActivityCreated()? Cause basically in FragB (FragB is a ListFragment, sorry that I wasn't specific before on this) depending on the string passed in from FragA's choice on the ListFragment, FragB goes into a database I have to retrieve a list. So how would I be able to access this information inside of my onActivityCreated()? – JoeyL Sep 07 '12 at 16:11
0

The way I have implemented this is by using the observer pattern. Pseudo code below:

Activity

public myActivity extends Activity implements OnDataPass {
    Observable fragmentData;

    void onDataPass(String data) { fragmentData = data; }
}

Fragment A

...
datapasser.onDataPass(data);
...

Fragment B

public FragmentB extends Fragment implements Observer {

onCreate(...) {
    ...
    ((myActivity)getActivity()).fragmentData.addObserver(this);
    ...
}

update(Object data) {
   // Voila - you will arrive here whenever the data is updated
}

Hope this helps...

Aviral
  • 1,141
  • 1
  • 10
  • 16
  • my FragB I forgot to mention is a ListFragment, but the update(Object data) is accessed at this line, ((myActivity)getActivity()).fragmentData.addObserver(this);? – JoeyL Sep 07 '12 at 15:58
  • I get an error inside void onDataPass(String data){ fragmentData = data;}, cause of type mismatch. – JoeyL Sep 07 '12 at 21:39
  • Apologies - there is a bug. It should be fragmentData.setData(data). The observable should implement this interface. Hope it does help this time... – Aviral Sep 10 '12 at 12:06