如何在java中的多个类中使用一个接口?

我有一个活动和2个片段。

我想在活动时listener.receivePreview(obj)然后

  1. 执行:OneFragment – > receivePreview。
  2. 执行:TwoFragment – > receivePreview。
 public class MainAct extends AppCompatActivity { public interface OnReceiveListener { // This can be any number of events to be sent to the activity void receivePreview(Object... obj); } private OnReceiveListener listener; } public class OneFragment extends Fragment implements OnReceiveListener{ @Override public void receivePreview(Object... obj) { } } public class TwoFragment extends Fragment implements OnReceiveListener{ @Override public void receivePreview(Object... obj) { } } 

我认为你可以使用观察者模式 ,这在你的情况下是一个很好的做法。

如GoF所述:

“定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖项”。

欲了解更多信息, 请访问http://www.java2blog.com/2013/02/observer-design-pattern-in-java.html#TLio7G2ruqxvfZUR.99

在您的情况下,您有这样的关系(一对多),当活动中发生事件时您想要知道两个片段。

在此处输入图像描述

片段是实现观察者类,您的活动具有主题角色,如上图所示。

我希望这可以帮助您以非常好的方式实现您的代码。 一些教程可以在以下链接中找到:

https://dzone.com/articles/observer-pattern-java http://www.tutorialspoint.com/design_pattern/observer_pattern.htm

编辑:在给定的情况下:

 public interface OnReceiveListener { // this is your observer interface ! // This can be any number of events to be sent to the activity void receivePreview(Object... obj); } 

使用此设计模式时,片段的定义正确,因此我不会更改其代码:

公共类OneFragment扩展Fragment实现OnReceiveListener {

 @Override public void receivePreview(Object... obj) { } 

}

 public class TwoFragment extends Fragment implements OnReceiveListener{ @Override public void receivePreview(Object... obj) { } 

你需要引用活动中的片段(作为观察者)。

 ArrayList< OnReceiveListener > observers = new ArrayList< OnReceiveListener>(); 

实际上,观察者可以订阅或注册自己的主题(片段持有对活动的引用(最好使用单例模式!:D)。像这样:

 public class MainAct extends AppCompatActivity { private static MainAct instance; public static MainAct getInstance() { if(instance != null) return instance; } // I think it is better to create the instance variable in the onCreate() method of the MainAct activity onCreate(...) { . . . instance = this; ... } public void registerObserver(OnReceiveListener observer){ observers.add(observer) } notifyObservers(){ // call this method in the listener you want for( Observer obser : observers) obser. receivePreview(param ) } ... 

//在片段初始化中:MainAct.getInstance()。registerObserver(this)

我用回答Sirvan Paraste。似乎这个有用的解决方案。

  public class MainAct extends AppCompatActivity { static List onReceiveList = new ArrayList(); public void attachOnReceiveListener(OnReceiveListener listener) { if (!onReceiveList.contains(listener)) { onReceiveList.add(listener); } } public interface OnReceiveListener { // This can be any number of events to be sent to the activity void receivePreview(Object... obj); } public onReceivePreview(Object... obj) { for (OnReceiveListener listener : onReceiveList) { listener.receivePreview(obj); } } } public class OneFragment extends Fragment implements OnReceiveListener{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainAct mainAct = new MainAct(); mainAct.attachOnReceiveListener(this); } @Override public void receivePreview(Object... obj) { } } public class TwoFragment extends Fragment implements OnReceiveListener{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainAct mainAct = new MainAct(); mainAct.attachOnReceiveListener(this); } @Override public void receivePreview(Object... obj) { } } 

尝试在每个片段中创建一个返回接口实例的函数

 public OnReceiveListener getListener() { mListener = this; return mListener } 

并在您调用该方法时的活动中编写以下代码

 fragmentInstance.getListener().receivePreview();