3

У меня есть одна деятельность и 2 фрагмента.Как использовать один интерфейс в нескольких классах в java?

Я хочу, чтобы, когда в деятельности пожара 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) { 

    } 
} 
+0

Можете ли вы объяснить немного более четко, чего именно вы хотите достичь? Кроме того, если вам нужен один интерфейс, зачем вы его реализуете в обоих фрагментах? –

+1

Попробуйте библиотеку eventbus greenrobots http://www.andreas-schrade.de/2015/11/28/android-how-to-use-the-greenrobot-eventbus/ –

ответ

2

Я думаю, вы можете использовать Observer Pattern, который является хорошая практика в вашей ситуации.

Как описано GoF:

«Определить один-ко-многим зависимость между объектами так, что когда один объект изменяет состояние, все его иждивенцам нотифицированными и обновляются автоматически».

Подробнее на http://www.java2blog.com/2013/02/observer-design-pattern-in-java.html#TLio7G2ruqxvfZUR.99

В вашей ситуации вы имеете такое отношение (один-ко-многим), и когда произошло событие в деятельности вы хотите знать, что два фрагмента.

enter image description here

фрагменты реализации класса наблюдателя и ваша деятельность играет роль субъекта, как показывают в рисунке выше.

Надеюсь, это поможет вам реализовать свой код очень красиво. некоторый учебник можно найти в следующих ссылках:

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

Edit: в данной ситуации:

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 extends 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 (это)

+1

Согласен с вами, может быть полезно дать пример того, как это можно использовать id в данной ситуации. – cyroxis

+0

Я согласен с вами, я думаю, что шаблоны проектирования - это концепция, которая должна использоваться в правильной ситуации. но сначала нам нужно узнать, что такое шаблон дизайна и почему мы будем их использовать. в этой ситуации это достаточно ясно, но я отредактирую свой ответ, чтобы привести пример. – Sir1

+1

Спасибо, это была хорошая идея. –

1

Попытка создать одну функцию в каждом фрагменте, который возвращает экземпляр интерфейсной

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

и в своей деятельности при вызове метода записи следующего кода

fragmentInstance.getListener().receivePreview(); 
2

Я использую ответ Sirvan Paraste .Это кажется, что это полезное решение

.