我正在开发一款Android应用,并使用this教程在地图上捕捉双击事件。但我认为这是一个更普遍的问题。因此,要获得有关特定事件的通知,我必须实现大量的侦听器。这些都有很多我不会用的方法,所以这些只是“污染”我的代码。是的,我可以使用一个监听器适配器类,但我也必须继承其他超类,并且遗憾的是,Java中没有多重继承。另外,在这种情况下我不能使用委托,因为我的Activity类也必须是监听器(至少我认为)。 那么,在Java中是否有任何方法可以实现所使用的方法,并以某种方式摆脱其他方法?
这是描述问题的示例代码:
// ...
public class MainActivity extends MapActivity implements OnItemSelectedListener, OnGestureListener, OnDoubleTapListener {
// ... my methods
public boolean onDoubleTap(MotionEvent e) {
// actually this method is used by me only
}
// ... lots of other implemented listener methods what I do not use
}
答案 0 :(得分:2)
没有。实现接口后,必须覆盖其所有方法。
答案 1 :(得分:2)
是的,使用 Java 8 ,您可以使用 默认 来有效地忽略未使用/不需要的方法。
这是一个扩展OnDoubleTapListener以仅关注onDoubleTap()方法的示例
interface OnDoubleTapOnlyListener extends GestureDetector.OnDoubleTapListener
{
default boolean onSingleTapConfirmed(MotionEvent e) { return false; }
boolean onDoubleTap(MotionEvent e);
default boolean onDoubleTapEvent(MotionEvent e) { return false; }
}
然后你可以实现onDoubleTap,其他人将被忽略。
很遗憾,Android尚不支持开箱即用的Java 8。 但是,您可以通过Retrolambda https://github.com/orfjackal/retrolambda
使用Java 8答案 2 :(得分:0)
我想你可能需要重新考虑一下这个设计。
显然需要您的应用程序响应各种事件,这些事件是由需要不同侦听器的机制生成的,但您只关心触发器的子集。
我要做的是实现MyAppEventTriggerQueue(它可以使用 内部http://developer.android.com/reference/java/util/concurrent/ConcurrentLinkedQueue.html。
该对象必须有一个工作线程,可以监听队列更改并触发您的自定义回调。
所有不同的侦听器(如MapActivity和SimpleGestureListener)都会通过触发自定义事件来填充MyAppEventTriggerQueue将响应的共享队列。
这样你就可以从各种接口和实现中解开你的自我,抽象出除了你需要的事件之外的所有事情。
这是一项更多的工作,但它最终应该是一个更清洁的解决方案。
答案 3 :(得分:0)
您可以使用抽象类:
abstract class DoubleTapListener implements GestureDetector.OnDoubleTapListener {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
@Override
abstract public boolean onDoubleTap(MotionEvent e);
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
}
public class MainActivity extends DoubleTapListener{
@Override
public boolean onDoubleTap(MotionEvent e) {
return false;
}
}