我有一个主要活动负责在不同的片段之间切换。这些片段具有活动需要实现的接口,以便片段将数据发送回活动。
目前,我将片段中onAttach
方法的上下文转换为片段中指定的特定接口的实例。但是,由于活动类必须实现所有这些才能使转换工作,接口中指定的方法也需要直接在类中实现。
我想要做的是创建这些接口的实例并将它们保存到类变量中。问题是如何将引用传递给片段?该过程应尽可能通用,以便轻松添加片段。
所以不是传统的方式
class MyActivity extends Activity implements MyFragmentListener {
public void myFragmentMethod() {
// ...
}
}
我想要的是
class MyActivity extends Activity {
private MyFragmentListener myFragmentListener = new MyFragmentListener() {
public void myFragmentMethod() {
// ...
}
};
}
问题是如何通知片段有关接口实现的信息。使用BroadcastReceiver会起作用,但看起来有点乱。
答案 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();
}
}