Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to handle multiple fragment interaction listeners in one Activity properly?

I have one Activity and six different Fragments attached to it. Each fragment has OnFragmentInteractionListener interface and activity implements all these listeners in order to receive callbacks. It looks a little messy, so I'm interested are there some patterns/ways to simplify this and make more elegant?

like image 903
MainstreamDeveloper00 Avatar asked Jun 10 '15 17:06

MainstreamDeveloper00


2 Answers

A good solution could be use the SAME OnFragmentInteractionListener for all fragments, and use one param of each listener methods (like a TAG parameter) to identificate what fragment sent the action.

Here an example:

Make a new class and every fragment use this class

OnFragmentInteractionListener.java

public interface OnFragmentInteractionListener {
    public void onFragmentMessage(String TAG, Object data);
}

In your activity:

public void onFragmentMessage(String TAG, Object data){
    if (TAG.equals("TAGFragment1")){
        //Do something with 'data' that comes from fragment1
    }
    else if (TAG.equals("TAGFragment2")){
        //Do something with 'data' that comes from fragment2
    }
    ... 
} 

You can use Object type to pass every type of data that you want ( then, in every if, you must convert Object to type that were necessary).

Using this way, maintenance is easier than have 6 differents listeners and a method for every type of data you want to pass.

Hope this helps.

like image 99
Neonamu Avatar answered Sep 28 '22 06:09

Neonamu


My attempt at improving neonamu's answer:

You can define an interface like specified above, but a generic one

public interface OnListFragmentInteractionListener<T> {

      void onListFragmentInteraction(String tag, T data);
}

Then in the host activity you can implement it specifically for the type you want, or like suggested above for Object:

public class MyFragActivity implements OnListFragmentInteractionListener<Object> {
    ...

    @Override
    public void onListFragmentInteraction(String tag, Object data) {
          //do some stuff with the data
    }
}

This way when you implement the interface depending on your application's needs, maybe you can reuse this interface in another situation.

like image 27
HenriqueMS Avatar answered Sep 28 '22 07:09

HenriqueMS