【问题标题】:How to use one interface in multiple class in java?java如何在多个类中使用一个接口?
【发布时间】:2016-09-25 17:57:09
【问题描述】:

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

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

  1. 执行:OneFragment -> 接收预览。
  2. 执行:TwoFragment -> 接收预览。
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) {

    }
}

【问题讨论】:

  • 你能解释得更清楚一点,你到底想达到什么目的?另外,如果你想要一个接口,为什么要在两个 Fragment 中实现它?
  • 试试 greenrobots 事件总线库andreas-schrade.de/2015/11/28/…

标签: java android android-fragments android-activity interface


【解决方案1】:

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

如 GoF 所述:

“定义对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖项都会得到通知并自动更新”。

阅读更多http://www.java2blog.com/2013/02/observer-design-pattern-in-java.html#TLio7G2ruqxvfZUR.99

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

Fragment 是实现观察者类,你的 Activity 具有主体的角色,如上图所示。

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

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);
    }

片段在这种设计模式下的定义是正确的,所以我不会更改它们的代码:

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) {

}

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

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)
}
/* To avoid memory leaks, remember to unregister receivers when no longer observing */
public void unregisterObserver(OnReceiveListener observer) {
    observers.remove(observer);
}
notifyObservers(){
// call this method in the listener you want 

for( Observer obser : observers)
    obser. receivePreview(param )

}
...

//in fragment initialization: 
MainAct.getInstance().registerObserver(this)

【讨论】:

  • 我同意您的评估,举个例子说明在给定情况下如何使用它可能会有所帮助。
  • 我同意你的观点,我认为设计模式是一个应该在适当情况下使用的概念。但首先我们需要了解什么是设计模式以及我们为什么要使用它们。在这种情况下很清楚,但我会编辑我的答案以给出适当的例子。
  • @ahmadaghazadeh Ghorbanat :))
  • 谢谢。请看我的解决方案。
【解决方案2】:

我使用答案Sirvan Paraste。看来这个有用的解决方案。

    public class MainAct extends AppCompatActivity {

         static List<OnReceiveListener> onReceiveList = new ArrayList<OnReceiveListener>();

        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) {

        }
    }

【讨论】:

    【解决方案3】:

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

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

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

    fragmentInstance.getListener().receivePreview();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-29
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多