AndroidのViewクラス群はViewを基点として階層化されており、非常に分かり易いし、扱いやすいのだが、そのViewで使用するEventとEventListenerが階層化されておらず、いろいろな所に散在しているのが非常に残念だ。
JFC/SwingならばEventはjava.util.EventObject、EventListenerはjava.util.EventListenerが階層の頂上だということが大前提のため扱い易い上に、AWTEvent以下のクラスに関してはイベントは種類毎にid値を持っており、カテゴライズも簡単だ。
例えばキーボードの打鍵のイベントはEventIdがKeyEvent.KEY_FIRST〜 KeyEvent.KEY_LASTの間であれば、全てKeyListenerというリスナを使うことが判っているので、使うEventIDが判れば、
EventListener el = createEventListener(eventId, action);
〜
EventListener createEventListener(int eventId, IAction action) {
〜
if( eventId >= KeyEvent.KEY_FIRST && eventId <= KeyEvent.KEY_LAST) {
return new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
runAction(action, eventId, e);
}
@Override
public void keyReleased(KeyEvent e) {
runAction(action, eventId, e);
}
@Override
public void keyTyped(KeyEvent e) {
runAction(action, eventId, e);
}
};
}
〜}
void runAction(IAction action, int evtID, AWTEvent e) {
if ( e.getID() == evtID )
action.invoke(e);
}
と、どんなリスナでもEventListenerで戻すことができる。
Androidの場合、このような処理は書けないし、使用しているイベントオブジェクトからベントリスナの型の名前を類推するしかない。また、スーパークラス/インタフェースが無いため、集約した処理が書けず、型毎に似たような処理を何度も記述する必要が出てくる。
EventIDは無くても困らないが、せめてEventObjectとEventListenerの階層下にあればな、と思う。
オープンソースなんだから全部自分で作り直せば? それもごもっとも。