なぜイベントリスナのコールバックメソッドは一つなのか?

このQ&Aのポイント
  • イベントリスナのコールバックメソッドは一つだけなのはなぜでしょうか?
  • インターフェイスだから一つのコールバックメソッドしか持たないのですか?
  • 複数のコールバックメソッドを持つことはできないのでしょうか?
回答を見る
  • ベストアンサー

イベントリスナのコールバックメソッドは何故一つ?

Android(JAVA)のイベントリスナについて教えてください >イベントリスナは、ひとつのコールバックメソッドを持つ View クラスのインターフェイスです。それらのメソッドは、リスナが登録されたビューでユーザがUI のアイテムにアクションを起こしたことがトリガとなり Android フレームワークにより呼び出されます ▽6.5 UIイベントハンドリング - ソフトウェア技術ドキュメントを勝手に翻訳   https://sites.google.com/a/techdoctranslator.com/jp/android/guide/ui/ui-events ・なぜ、コールバックメソッドをひとつしか持たないのでしょうか? ・複数持ってはいけないのでしょうか? ・インターフェイスだから? ・言語機能として複数保持出来ないことはないけれども、イベントリスナ的に分かりやすくするため(?)、敢えて機能毎に分けているのでしょうか? ■質問背景 ・ドキュメント見てたらそうなってたので、なんでかな? と思い質問しました ・複数インターフェイスにそれぞれ唯一の抽象メソッドを持たせず、1つのインターフェイスに複数の抽象メソッドを持たせたほうが分かりやすいような気もするのですが… 「View.AllListener」に「onClick()」「onLongClick()」みたいなのは何故ダメなのでしょうか?

  • re97
  • お礼率80% (601/744)
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

>・なぜ、コールバックメソッドをひとつしか持たないのでしょうか? 機能の付与はメソッド単位だからではないでしょうか? >「View.AllListener」に「onClick()」「onLongClick()」みたいなのは何故ダメなのでしょうか? いいと思います。自前でコールバックメソッドを持つ複数のインターフェースを継承する、 または実装する抽象クラスを作成すれば良いです。 ただ、MouseListenerで不要なメソッドを空実装するときに感じましたが、 Eclipseなどのクラスのアウトライン機能では空実装が判断できず、見渡しが悪い。 プログラムが無駄に肥大化する。 あとは、UnsupportedExceptionを投げるとかあるのかな? この辺のインターフェースでは提供されているけど、 機能としては提供されていないメソッドへの対応はいまいち統一されていないので、 不要なメソッドは追加しない方針の方がいいかなーと思います。

re97
質問者

お礼

回答ありがとうございました。 参考になりましたー

関連するQ&A

  • Androidイベントリスナ、イベントハンドラ違い

    Androidににおける「イベントリスナ」「イベントハンドラ」の違いを教えてください ・イベントに対応するメソッドが、「View クラスのインターフェイス」「View クラス」に分かれている理由が分かりません ・なぜメソッドによって、「インターフェイス」にあったり、「クラス」にあったりするのでしょうか? ・「onKeyDown」みたいにAndroid 自体が自動検知(?)するイベント対応メソッドは、「View クラス」に書かれる決まり? ・「onClick」などのイベントは、リスナに登録しないと利用できないから(?)、「インターフェイス」に書いてある? ・「イベントリスナ」は、「イベントハンドラ」の一種類なのでしょうか? ▽6.5 UIイベントハンドリング - ソフトウェア技術ドキュメントを勝手に翻訳   https://sites.google.com/a/techdoctranslator.com/jp/android/guide/ui/ui-events#EventHandlers

    • ベストアンサー
    • Java
  • Android/OnClickListener

    Android/View.OnClickListenerインターフェイス インターフェイスについて教えてください。 下記ページで、「View.OnClickListenerインターフェイス」をimplementsする必要性が理解できません。 ▽Androidアプリにおけるユーザインタフェースの基本処理(3/4):CodeZine   http://codezine.jp/article/detail/6026?p=3 最終的に、ViewクラスonClickメソッドを呼び出すのであれば、 Viewクラスを継承すれば良いと思うのですが、 どうして、「View.OnClickListenerインターフェイス」をimplementsするのでしょうか? ボタンのオブジェクトにリスナーを登録する際、 「リスナーイベントに応じて呼び出されるメソッド」は少ないほうが良い、から? それとも、ViewクラスsetOnClickListenerメソッドの引数に書いている内容に関係しているのでしょうか? ▽View | Android Developers http://developer.android.com/reference/android/view/View.html#setOnClickListener(android.view.View.OnClickListener) >public void setOnClickListener (View.OnClickListener l) この引数(View.OnClickListener l)の意味を教えてください。 View.OnClickListener型しか受け付けない? l って何ですか?

    • ベストアンサー
    • Java
  • イベントをつかってコールバックさせたいのですが

    HTAスクリプトでIEを起動し、ページが表示されるのを待つプログラムを 作成しようとしています。 JavaScriptではスリープができないのでisBusyをがfalseになるのを 待つ代わりに、IEオブジェクトのイベントからコールバックさせようと思いました。 そこで次のプログラムを書いたのですが、 イベントハンドラ登録の文法が間違っているらしく、実行時に 「オブジェクトでサポートされていないメソッドまたはプロパティです」 になってしまいます。 この行でやりたいことは、ieオブジェクトの NavigateComplete2 イベントが発生したときに、onComplete が呼ばれるようにすることです。 イベントハンドラの登録方法、または ieがページを読み終わるのを検知するよい方法がありましたら お教え下さい。よろしくお願いします。 ■sample.hta <html> <script> function perform(){   var ie = new ActiveXObject("InternetExplorer.Application");   ie.visible=true;   ie.navigateComplete2 = onComplete; // ←この行がエラー   ie.navigate("http://www.1101.com"); } function onComplete(a, b){   alert("complete"); } </script> <body> <input type=button onclick="perform();" value="open"> </body> </html>

  • イベントリスナーで読み込んだ後に、DOMで文字を表

    イベントリスナーで読み込んだ後に、DOMで文字を表示させたい。 DOMを使って、文字を表示させるならイベントリスナーで読み込み必要があると思いました。 そこで、下記のように書いて試してみました。 function hoge(){ this.view = function(){ window.addEventListener( 'load',this.foo, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); すると、「undefined」と表示されます。 どうすればいいのでしょうか。よろしくお願いします。

  • リスナについて

    Java を勉強している者です GUIライブラリである awt,swing のリスナについての質問です awt,swing では リスナというイベント処理用のクラスと処理内容を用意して その部品に、イベント用のリスナを登録することによって、コールバックする仕組みになっていると思います。 リスナとイベントの対応ですが、マウスリスナやキーリスナ、ボタンを押したときに対応するアクションリスナ などがありますが、多用する再描画に関しての paintListener がありません 再描画に対応する場合、常に部品を継承して、paintcomponent をオーバーライドして記述しなければなりません 再描画も重要なイベントだと思うのですがなぜリスナが用意されてないのか。 JFrame j = new JFrame(); j.addPaintListener( new PaintAdapter { void onPaint() { ... } } のように描画処理を後付できないかという質問です。 できるようならサンプルのコードを教えてください。 またpaintリスナが用意されない理由があればこれも教えていただけると幸いです。

    • ベストアンサー
    • Java
  • イベントリスナーの部分を関数にしたい

    イベントリスナーの部分で、「load」以外に「change」も必要になったので関数にしたいのですが、 引数の関数の指定方法がわかりません。 どうすればいいのでしょうか。よろしくお願いします。 【イベントリスナーを関数にする前】 function hoge(){ this.view = function(){ var _this = this; window.addEventListener( 'load',function(){ _this.foo()}, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); 【やってみたこと】 function hoge(){ this.view = function(){ var _this = this; var func = function(){ _this.foo()}; this.addListener( 'window', 'load', func ); } this.addListener = function(elem,type,func){ elem.addEventListener( type,func, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view();

  • JSのイベントターゲット が難しい

    JSのイベントターゲット (EventTarget)が難しくてよくわからないのですが初心者にもわかるように解説していただけるとありがたいです。 https://developer.mozilla.org/en-US/docs/Web/API/EventTarget イベントターゲット(EventTarget)は、DOMイベントを受け取り、それらへのリスナーを持つことが出来るオブジェクトによって実装されるDOMインターフェースです。 Elementと、 documentと、 windowは、ほとんどの共通イベントターゲットですが、 例えば、XMLHttpRequest、AudioNode、AudioContextなど、 他のオブジェクトもエベントターゲットになることが可能です。 多くのイベントターゲット(Element、document、windowを含む)は、 onXXXプロパティと属性を介して、 イベントハンドラの設定もサポートします。 メソッド .addEventListener() 要素にイベントハンドラを登録します。 .dispatchEvent() DOM内のノードのイベントを実行します。 .removeEventListener() EventTarget.addEventListenerを使用して登録されたイベントリスナーを削除します。 イベントを発動させる要素につけるイベントファンクションのようなものなのでしょうか?

  • RequestDispacherインターフェイスのことを知っている方がいたら・・

    マニアックな質問なのかもしれませんが・・ インターフェイス及び抽象メソッドの定義は ●インターフェイスに定義されているメソッドは必ず抽象メソッドである ●抽象メソッドにはメソッドのプロトタイプだけが定義されている だと思うのですが、 RequestDispatcherインターフェイスのforwardメソッドには既に 「サーブレットから他のリソースへ、requestオブジェクトとresponseオブジェクトを転送する」 という処理内容が定義されているように思います。>java.sun.comのapiドキュメント これってインターフェイスの原則から外れていると思うのですが、 どうなのでしょうか。「例外」もあるってことなんでしょうか。 おひまだったら解答をお願いいたします。

    • ベストアンサー
    • Java
  • C言語のコールバック

    Java/C#/PHPといった言語はすでに使えるのですが、現在C言語およびWin32 APIを勉強中です。 C言語の関数にはJavaなどのインスタンスメソッドのthisにあたる引数が渡されませんが、Win32 APIのウィンドウプロシージャに代表されるコールバック関数において不都合があります。Javaの場合は、 interface Callback{ void onCallback(); } といったインターフェイスが定義されているものとして、 hoge(new Callback(){ int data = 10; public void onCallback(){ System.out.println(data); } }); のようなコードで引数以外のデータも参照できますが、C言語ではこのように引数で渡せないデータを参照するにはどうしたらよいでしょうか。グローバル変数として参照するのは、Javaのstaticなフィールドと同様に拡張性を損なうので避けたいと思います。

  • Javaにおけるイベント処理

    JFrame  SpritPanel   SpritPanel    JPanel     JButton A     JButton B     JButton C    JList A   SpritPanel    JList B    JTable C という構成で、JButton A をクリックしたらJList AにJButton A用のなんらかのリストを表示し、JButton BをクリックしたらJList BにJButton B用のなんらかのリストを表示し、・・・ と1つGUI部品で発生するイベントで1つまたは複数のGUI部品の更新処理を行いたいのですが、イベントリスナをどこに実装させて、どこに更新処理を書くかで迷います。 例えば、押されるJButton Aにイベントリスナーのメソッドを実装し、そこで処理を書く場合はJList Aをこのメソッド内から見えるようにしなけなくて、それをするためにインスタンスを渡したりするのが面倒に感じています。 様々なGUI部品やパネルで構成され、イベントが起きたら複数のGUI部品が更新が必要となるようなGUIアプリケーションを作る場合、どのようにイベントを処理させるのが王道なのでしょうか。 うまく質問できないので、質問内容に不明な点があれば補足いたします。

    • ベストアンサー
    • Java

専門家に質問してみよう