我有一个包含7个片段的活动A.对于片段到活动和片段到片段之间的通信,My活动明确地声明了所有7个片段的Fagment接口。 语法就像
class A extends Activity implements B.onInteraction, C.onInteraction, D.OnInteration .... {
}
这变得很长,我不喜欢明确地将其声明在活动之上。
我能想到的另一个解决方案是在每个片段中定义一个方法setOnInteractionListener()
,并将匿名类传递给它。就像。
class B extends Fragment {
public void setOnFragmentInteractionListener(OnFragmentInteraction listener) {
}
}
通过这种方式,我不需要覆盖片段的onAttach()
,我不需要在顶部声明片段接口。
我的问题是:这是一种很好的做事方式吗?在这里使用匿名类有什么缺点。有没有更好的方法来做到这一点,或者我应该坚持在创建活动时明确声明界面。
答案 0 :(得分:1)
我不确定我是否理解这个问题因为我是初学者。我的意见可以为你的所有片段创建一个界面:
public interface ActivityListener {
void onCall(Fragment fragment);
}
您的活动:
public class MainActivity extends AppCompatActivity implements ActivityListener {
@Override
public void onCall(Fragment fragment) {
switch (fragment.getTag()) {
case YOUR_TAG:
Log.d("listener", "called");
break;
}
}
}
在你的片段中使用onAttach()方法获取接口。
答案 1 :(得分:0)
我更喜欢使用EventBus(特别是https://github.com/greenrobot/EventBus,有人更喜欢http://square.github.io/otto/)来在Fragments和Activity之间进行通信。
您需要注册(和取消注册)侦听器(例如,活动或其他片段)并使用onEvent(<CustomEventclass> event);
EventBus.getDefault().register(this); //and unregister
只需从片段中发布事件,如
EventBus.getDefault().post(<CustomEventClass> instance);
制作BaseFragment并传递监听器也是一种常规方式。这只是开发人员的选择。