【问题标题】:Implementing Fragment to Activity communication without implementing interfaces directly in Activity实现 Fragment 到 Activity 的通信,而不直接在 Activity 中实现接口
【发布时间】:2017-07-30 16:27:13
【问题描述】:

我有一个负责在不同片段之间切换的主要活动。这些片段具有活动需要实现的接口,以便片段将数据发送回活动。

目前我将片段中onAttach 方法的上下文转换为片段中指定的特定接口的实例。但是,由于活动类必须实现所有这些才能进行强制转换,因此接口中指定的方法也需要直接在类中实现。

我想做的是创建这些接口的实例并将它们保存到类变量中。问题是如何将引用传递给片段?该过程应尽可能通用,以便轻松添加片段。

所以而不是传统的方式

class MyActivity extends Activity implements MyFragmentListener {
    public void myFragmentMethod() {
        // ...
    }
}

我想要的是

class MyActivity extends Activity {
    private MyFragmentListener myFragmentListener = new MyFragmentListener() {
        public void myFragmentMethod() {
            // ...
        }
    };
}

问题是如何通知片段有关接口实现的信息。使用 BroadcastReceiver 可以,但看起来有点乱。

【问题讨论】:

  • 试试 Eventbus。它更清洁
  • @RissmonSuresh 看起来不错,但这并不能解决从类根中解耦方法的问题。

标签: java android android-fragments interface


【解决方案1】:

事件总线

不是脏东西☺️ 试试看,你很快就会上瘾的…… 它专门用于像您这样的情况,并且使用起来超级简单。 你定义一个类,你可以添加参数、方法等等......你只需填充所需的事件(使用类名),天空就是这里的极限。 EventBus

你会在那里看到描述

【讨论】:

    【解决方案2】:

    在 Fragment 中有一个监听器的 setter 方法。并在创建 Fragment 之后从 Activity 调用该 setter 方法。

    【讨论】:

    • 这并不是很通用。目前我通过调用Class.forName(...).newInstance() 从类名中实例化片段。我必须将这些动态转换为特定的片段,然后调用一个方法。这变得相当复杂,我不确定它是否会起作用:由于每个接口的接口都不相同,我仍然需要一一检查。
    【解决方案3】:

    实际上只有两种方法可以“干净地”将片段和活动挂钩以进行通信:Fragment.onAttach()Activity.onAttachFragment()

    标准模式是这样的(在您的片段中):

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        callbacks = (MyInterface) context;
    }
    

    你说你不想这样做。这有点奇怪,但没关系。您或许可以尝试一种稍微不同的方法:

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        MyActivity activity = (MyActivity) context;
        callbacks = activity.getCallbacks();
    }
    

    这有点尴尬,因为您必须为各种片段中的每种类型的回调接口公开一个 getter,但它应该可以工作

    您也可以尝试从活动的角度来处理它:

    @Override
    public void onAttachFragment(Fragment fragment) {
        super.onAttachFragment(fragment);
        if (fragment instanceof FragmentTypeOne) {
            ((FragmentTypeOne) fragment).setCallbacks(callbacksOne);
        } else if (fragment instanceof FragmentTypeTwo) {
            ((FragmentTypeTwo) fragment).setCallbacks(callbacksTwo);
        } // ...
    }
    

    这也有点尴尬,因为您必须反复调用instanceof 才能知道将哪个字段传递给片段。

    不过,我希望这会有所帮助。

    编辑

    我刚刚想到的另一个想法是在您的活动中实现接口,然后简单地将调用转发给您的助手。这可能不符合您的要求,因为它仍然涉及让您的 Activity 实现所有各种接口,但它应该允许您创建单独的类来实现实际行为,并且您的 Activity 看起来像这样:

    class MyActivity extends Activity implements MyFragmentListener {
        public void myFragmentMethod() {
            helper.myFragmentMethod();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 2016-03-07
      相关资源
      最近更新 更多