实现Fragment to Activity通信而不直接在Activity

时间:2017-07-30 16:27:14

标签: java android android-fragments interface

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

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

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

所以不是传统的方式

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

我想要的是

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

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

3 个答案:

答案 0 :(得分:0)

  

EventBus

不是肮脏的东西☺️ 尝试一下,你很快就会上瘾...... 它专门用于像你这样的情况和超级简单的使用。 你定义一个类,你可以添加参数,方法等等......你只需填充所需的事件(带有类名),天空就是这里的限制。 EventBus

你会看到那里的描述

答案 1 :(得分:0)

在Fragment中为Listener设置一个setter方法。在创建Fragment之后,从Activity调用setter方法。

答案 2 :(得分:0)

真的只有两种方式可以干净利落地#34;将片段和活动挂钩在一起以进行交流: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来知道传递给片段的字段。

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

修改

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

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