Android/OnClickListenerについての疑問

このQ&Aのポイント
  • Androidアプリでのユーザーインターフェースの処理において、View.OnClickListenerインターフェイスを実装する必要性がわかりません。
  • ViewクラスのonClickメソッドを呼び出すためには、Viewクラスを継承すればよいのではないかと思いますが、なぜView.OnClickListenerインターフェイスを実装する必要があるのでしょうか?
  • また、ViewクラスsetOnClickListenerメソッドの引数のView.OnClickListener lの意味を教えてください。lは何を指していますか?
回答を見る
  • ベストアンサー

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 って何ですか?

  • re999
  • お礼率61% (476/777)
  • Java
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
noname#161640
noname#161640
回答No.1

>「View.OnClickListenerインターフェイス」をimplementsする必要性が理解できません。 implementsしないと、クリックイベントがButttonに渡されないからです。 >最終的に、ViewクラスonClickメソッドを呼び出すのであれば、 >Viewクラスを継承すれば良いと思うのですが、 Viewに、onClickなどというイベント用メソッドはありません。 このonClickがあるのは、まさしくimplementsしたView.OnClickListenerの中です。 つまり、View.OnClickListenerをimplementsしたからこそ、クリックしたときにonClickが呼び出されるようになったのです。implementsしていなかったら、クリックしても何も起こりません。「クリックした」というイベントが素通りしてしまうので。 コンポーネント類は、基本的に初期状態では「何のイベントも認識しない」のです。このコンポーネントに、イベントリスナーを追加すると、そのイベントをコンポーネントが受け取れるようになります。 >この引数(View.OnClickListener l)の意味を教えてください。 おっしゃるように、引数に渡せるのはView.OnClickListener「として扱えるインスタンス」のみ、ということです。 thisは、implements OnClickListenerしていますから、OnClickListenerインスタンスとして振る舞うことができます。

re999
質問者

お礼

回答ありがとうございました >Viewに、onClickなどというイベント用メソッドはありません。 >このonClickがあるのは、まさしくimplementsしたView.OnClickListenerの中です 勘違いしていました >引数に渡せるのはView.OnClickListener「として扱えるインスタンス」のみ、ということです >thisは、implements OnClickListenerしていますから、OnClickListenerインスタンスとして振る舞うことができます 説明分かりやすかったです

その他の回答 (1)

  • LOHA
  • ベストアンサー率52% (203/388)
回答No.2

>インターフェイスについて教えてください。 いわゆるポリモーフィズムという概念ですね。 ポリモーフィズム、継承、インターフェースとかのキーワードでググれば解説がわんさか出てくると思います。 >最終的に、ViewクラスonClickメソッドを呼び出すのであれば、 >Viewクラスを継承すれば良いと思うのですが、 命名が若干紛らわしいですが、ViewクラスにonClickというメソッドは定義されていないと思います。 なので、継承してonClickメソッドを定義しても、新しくonClickを定義しただけでしかなく、何も起きません。 >どうして、「View.OnClickListenerインターフェイス」をimplementsするのでしょうか? implementsしてリスナーを登録するというのはGUIではよく使われる定石です。 >l って何ですか? Listenerの頭文字の"l"じゃないですかね。まぁタダの変数名です。 #最初1と空目した…。

re999
質問者

お礼

回答ありがとうございました >いわゆるポリモーフィズムという概念ですね。 >ポリモーフィズム、継承、インターフェースとかのキーワードでググれば解説がわんさか出てくると思います アドバイスありがとうございます。キーワードが分かったので調べやすかったです >ViewクラスにonClickというメソッドは定義されていないと思います 勘違いしていました… >implementsしてリスナーを登録するというのはGUIではよく使われる定石です 定石なんですね。情報ありがとうございます。知りませんでした… >Listenerの頭文字の"l"じゃないですかね。まぁタダの変数名です 改めてリファレンス見たら、例えば、「View v」とか書いてある箇所とかも、何か特別な意味があるのかと思っていたのですが、単純に頭文字取っているだけなんですね。参考になりましたー

関連する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 static finalクラス

    static final classって何ですか? ▽R.attr | Android Developers   http://developer.android.com/reference/android/R.attr.html に「static final class」ってあるのですが、意味が良く分かりません。 ・「static final」フィールドと何が違うのでしょうか? ・どうしてフィールドにせず、クラスにしているのでしょうか? ・ただの定数ということでしょうか?

    • ベストアンサー
    • Java
  • eclipseでのコード補完

    public class HelloWorldActivity extends Activity implements View.OnClickListener { 上記のコードで "implements View"と入力した直後に、コード補完(Ctrl + Space)しても android.view.Viewクラスが補完候補に現れません。 何故、補完候補に表示されないのでしょうか? また、コード補完を使って、"View.OnClickListener"を素早く入力するにはどうしたらよいのでしょうか? Eclipse Indigo(3.7.1) JDK 1.6.0_29 Android SDK 3.2 よろしくお願いします。

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

    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()」みたいなのは何故ダメなのでしょうか?

    • ベストアンサー
    • Java
  • Android super.onCreate(sa

    Androidで、アクティビティオブジェクトを生成している箇所(new Activity?)を見たいのですが、 どこで生成しているのでしょうか? ネットを見たら、 super.onCreate(savedInstanceState);で、画面オブジェクトを作成、て書いてあったのですが、 ここで言う.onCreateは、 ▽Activity | Android Developers   http://developer.android.com/intl/ja/reference/android/app/Activity.html#onCreate(android.os.Bundle) のことでしょうか? 見方が分からないのですが、このメソッドで、画面オブジェクトを生成しているのでしょうか? それとも、コンストラクタか何かで、画面オブジェクトを生成しているのでしょうか? それは、どこに書いてあるのでしょうか?

    • ベストアンサー
    • Java
  • Android JAVAへでの質問です

    (←※この部分!) の意味がわからないのでどなたか教えていただけないでしょうか? private EditText edit1; ですが、なぜ private がついているのでしょうか?なくても動きましたが何か意味があるのでしょうか? そしてどうして、この子はここにいるのでしょうか? Button btn1 と一緒に仲良くいてもいいんじゃないでしょうか? ================ import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.view.*; import android.view.View.OnClickListener; import android.widget.*; public class Test2Activity extends Activity { private EditText edit1;(←※この部分!) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); edit1 = (EditText)this.findViewById(R.id.EditText1); Button btn1 = (Button)this.findViewById(R.id.button1); btn1.setOnClickListener(new MyClickA()); } class MyClickA implements OnClickListener { public void onClick(View view){ Editable e = edit1.getText(); int n = Integer.parseInt(e.toString()); Toast toast = Toast.makeText(getApplicationContext(), "数値=" + n, Toast.LENGTH_SHORT); toast.show(); } } }

    • ベストアンサー
    • Java
  • activityからviewクラスを呼び出すには?

    アンドロイドアプリを開発しているものですが、質問があります。 mainのactivityにボタンを表示させて、そのボタンが押されたらviewクラスを継承して自作したクラスScreenを呼び出したいと思っているのですが、うまくいきません。 Button btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(new View.OnClickListener(){ public void onClick(View view){                         Intent intent  =  new Intent(start.this , Screen.class) ;                                   startActivity(intent) ;           }           }               ) ; AndroidMainifest.xmlのActivityにも遷移先のクラス名を挿入していますので、問題がないはずなのですが、どなたか詳しい方お願い致します。 初心者なので、拙い説明で申し訳ありませんが、是非回答よろしくお願いいたします。

  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • doGetの引数に「入るモノ」について

    サーブレットにおけるクラスのdoGetメソッドについて 質問です(Tomcat3.2.1 + JDK1.3)。 public void doGet(HttpServletRequest request, HttpServletResponse response) 理屈で考えると、このdoGetメソッドの2つの仮引数 (request, response)には、 「インターフェースHttpServletRequestをimplements したクラス」のインスタンス ‥‥と、 「インターフェースHttpServletRequestをimplements したクラス」のインスタンス の2つのインスタンスが入れられるハズですよね。 そこで疑問なのが、 1. それら2つのクラスの名前はなんというのでしょう? (というのはインターフェースHttpServletRequestや インターフェースHttpServletResponseを 実装したクラスのメソッドの処理内容の定義を 見たいのです‥) 2. 誰がそのクラスをインスタンス化しているのでしょう? (サーブレットコンテナのTomcat? JRE? JVM?‥ いったい誰が?‥‥用語の区別も曖昧なのですが) 補足すると、 Javaアプリケーションのmainメソッドでは、 public static void main(String[] args) として、コマンドラインの引数がそのまま仮引数argsに 入る。じゃあ、サーブレットの場合はどうなのか? といった感じです。 2.のほうはトンチンカンな質問かもしれませんが、 1.の質問は切実です。 ご存知の方、教えてください。

    • ベストアンサー
    • Java
  • インターフェースについて

    いまサーブレットをやっています。 Java言語仕様では、 「インターフェースの定義には、メソッドの定義を書いてはいけない」 (メソッドの定義はそのインターフェースをimplementsしたクラスのなかで オーバーライドする) ということになってますよね? …でも、 APIリファレンスを読むと、 インターフェースHttpServletRequestのメソッドgetParameterには、 「リクエストパラメータの値をString型として返す」と書かれています。 ↑これって上記のJava言語仕様と矛盾してませんか? まるでどこかでgetParameterメソッドの定義がなされているかのようです。 これってどういうことでしょう? 考えれば考えるほど、訳わかりません。とっても混乱中です(-_-)

    • ベストアンサー
    • Java

専門家に質問してみよう