【问题标题】:How to handle multiple fragment interaction listeners in one Activity properly?如何正确处理一个 Activity 中的多个片段交互侦听器?
【发布时间】:2015-06-10 17:04:45
【问题描述】:

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

【问题讨论】:

    标签: java android android-fragments android-activity fragmentmanager


    【解决方案1】:

    一个好的解决方案是对所有片段使用相同的 OnFragmentInteractionListener,并使用每个侦听器方法的一个参数(如 TAG 参数)来识别哪个片段发送了动作。

    这里是一个例子:

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

    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 个不同的侦听器和一个用于您要传递的每种数据类型的方法更容易。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我改进neonamu's answer的尝试:

      你可以定义一个像上面指定的接口,但是一个通用的

      public interface OnListFragmentInteractionListener<T> {
      
            void onListFragmentInteraction(String tag, T data);
      }
      

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

      public class MyFragActivity implements OnListFragmentInteractionListener<Object> {
          ...
      
          @Override
          public void onListFragmentInteraction(String tag, Object data) {
                //do some stuff with the data
          }
      }
      

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

      【讨论】:

      • 像魅力一样工作。非常感谢!
      • 我想知道你为什么使用@Override 而用户 Neonamu 不使用。两者都有效吗?
      • @Burkely91 是的,没有它它也可以工作。但是你应该使用它。 Java 中的 override 注释旨在检查/验证您实际上正在执行您认为的覆盖(例如,如果您忘记参数,它将报告错误)没有 Override 您只需定义一个新方法具有相同名称的不同参数(执行重载)并且未实现接口
      猜你喜欢
      • 2013-10-12
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多