Fragment interface communicating with another frag

2020-02-12 18:11发布

问题:

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

回答1:

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
    }
}


回答2:

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...