如何正确处理一个Activity中多个Fragment的交互监听器?

13

我有一个Activity和六个不同的Fragments附加到它上面。每个Fragment都有一个OnFragmentInteractionListener接口,而活动实现了所有这些侦听器以便接收回调。这看起来有点混乱,所以我想知道是否有一些模式/方法可以简化这个过程并使其更优雅?

2个回答

24
一个好的解决方案可能是为所有片段使用相同的OnFragmentInteractionListener,并在每个监听器方法中使用一个参数(如标签参数)来标识发送操作的片段。
以下是示例:
创建一个新类并使每个片段使用该类。
OnFragmentInteractionListener.java
public interface OnFragmentInteractionListener {
    public void onFragmentMessage(String TAG, Object data);
}

在您的活动中:

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

您可以使用 Object 类型来传递所需的任何数据类型(然后,在每个 if 语句中,您必须将 Object 转换为必要的类型)。

使用这种方法,维护比拥有6种不同的侦听器和为要传递的每种数据类型编写一个方法更容易。

希望能对您有所帮助。


8

我试图改进neonamu的答案

您可以像上面指定的那样定义一个接口,但是要使用通用接口。

public interface OnListFragmentInteractionListener<T> {

      void onListFragmentInteraction(String tag, T data);
}

然后,在主活动中,您可以为所需类型实现它,或者像上面建议的那样实现Object。
public class MyFragActivity implements OnListFragmentInteractionListener<Object> {
    ...

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

这样,当您根据应用程序的需要实现接口时,也许您可以在另一种情况下重复使用此接口。

1
非常好用,非常感谢! - B.K.
我想知道为什么你使用 @Override,而 Neonamu 用户没有使用。两者都可以工作吗? - Burkely91
1
@Burkely91 是的,没有它也可以工作。但是你应该使用它。Java中的override注释旨在检查/验证您实际上正在执行您认为的覆盖(例如,如果您忘记了参数,它将报告错误)。没有Override,您只是定义了一个具有相同名称不同参数的新方法(进行重载),而不是实现接口。 - HenriqueMS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接