1

我正在开发一个 Android 应用程序,并使用教程来实现在我的地图上捕获双击事件。但我认为是一个更普遍的问题。因此,为了获得有关特定事件的通知,我必须实现很多侦听器。这些有很多我永远不会使用的方法,所以这些只是“污染”我的代码。是的,我可以使用侦听器适配器类,但我也必须从其他超类继承,不幸的是,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
}
4

4 回答 4

2

不可以。一旦一个接口被实现,它的所有方法都必须被覆盖。

于 2012-12-04T19:04:57.810 回答
2

是的,使用Java 8,您可以使用default来有效地忽略未使用/不需要的方法。

这是一个将 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

于 2016-02-09T22:40:14.937 回答
0

我认为您可能需要重新考虑一下设计。

您的应用程序显然需要响应各种事件,这些事件是由需要不同侦听器的机制生成的,但您只关心触发器的子集。

我要做的是实现 MyAppEventTriggerQueue (它可以在内部使用 http://developer.android.com/reference/java/util/concurrent/ConcurrentLinkedQueue.html)。

  1. 该对象必须有一个工作线程来侦听队列更改并触发您的自定义回调。

  2. MapActivity 和 SimpleGestureListener 等所有不同的侦听器将填充共享队列,您的 MyAppEventTriggerQueue 将通过触发您的自定义事件来响应该队列。

这样你就可以从各种接口和实现中解脱出来,抽象出除了你需要的事件之外的所有东西。

这是一个多一点的工作,但它最终应该是一个更清洁的解决方案。

于 2012-12-04T19:26:15.233 回答
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;
    }
}
于 2019-07-26T11:35:46.467 回答