如何在一个Activity中正确处理多个片段交互监听器?

Mai*_*r00 13 java android android-fragments android-activity fragmentmanager

我有一个Activity和六个不同的Fragments附加.每个片段都有OnFragmentInteractionListener接口,活动实现所有这些监听器以接收回调.它看起来有点乱,所以我感兴趣的是有一些模式/方法来简化这个并使它更优雅吗?

Neo*_*amu 23

一个好的解决方案可以是对所有片段使用SAME OnFragmentInteractionListener,并使用每个侦听器方法的一个参数(如TAG参数)来标识发送操作的片段.

这是一个例子:

创建一个新类,每个片段都使用此类

OnFragmentInteractionListener.java

public interface OnFragmentInteractionListener {
    public void onFragmentMessage(String TAG, Object data);
}
Run Code Online (Sandbox Code Playgroud)

在您的活动中:

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
    }
    ... 
} 
Run Code Online (Sandbox Code Playgroud)

您可以使用对象类型传递所需的每种类型的数据(然后,在每个if中,您必须将Object转换为必要的类型).

使用这种方式,维护比6个不同的侦听器和每个要传递的数据类型的方法更容易.

希望这可以帮助.


Hen*_*eMS 8

我尝试改善neonamu的答案:

您可以定义上面指定的接口,但是通用接口

public interface OnListFragmentInteractionListener<T> {

      void onListFragmentInteraction(String tag, T data);
}
Run Code Online (Sandbox Code Playgroud)

然后在主机活动中,您可以专门为您想要的类型实现它,或者像上面建议的对象:

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

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

这样,当您根据应用程序的需要实现接口时,也许您可​​以在其他情况下重用此接口.