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ではデフォルトを使用して、使用されていない/不要なメソッドを効果的に無視できます。

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 に答える