2011-08-04 13 views
14

申し訳ありませんが、この質問は愚かですが、私はJavaの構文の周りに私の頭を包むことができません。私はC/C++を学んだ
私は知っているViewは良いクラスですが、私は理解していませんView.OnClickListener ()はメソッドです。
オブジェクトを返さない限り、私はそれを疑いますか?
私はViewが静的なOnClickListenerメンバーオブジェクトを持つクラスだと思う。私には意味がない。
このコード行で何が起きているのか説明できる人はいますか?View.OnClickListener、メソッドまたはクラス?

button1 = (Button) findByView(R.id.button1) ; 
    button1.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 

     } 
    } 

このコードでは何が起こっていますか?

Button1は、xmlファイルのbutton1オブジェクトへの参照です。

button1オブジェクトにはメンバオブジェクトsetOnClickListenerがあります。その名前から私はボタンまたは何かにイベントを初期化すると仮定します。しかしそれはView.OnClicListener()オブジェクトを受け取る。

私はそのことで混乱しています.onClickはViewオブジェクトを受け取るので、onClickListenerはオブジェクトではありませんViewオブジェクトを返しますか?私はまったくそれを得ていない。

誰かがその行で何が起こるか説明できますかView.onClickListener()new thisという別の方法ですか?

答えて

21

View.OnClickListener is an interface、あなたは(new View.OnClickListener()がコンストラクタの呼び出しです)を呼び出し、それの新しいインスタンスを作成していない

作成したインスタンスは、右new View.OnClickListener()下の括弧で、anonymous classView.OnClickListenerimplementsことです

それに宣言されたメソッドを実装する必要がありView.OnClickListenerを実装するすべてのクラス(例えばonClick

setOnClickListenerはあなたが指定したView.OnClickListenerインスタンスへの参照を保存し、誰かがボタンをクリックすると、設定したリスナーのメソッドonClickが呼び出されます。

+14

小さな追加: 'View.OnClickListener'の' .'で混同しないでください。メソッドコールで何もすることはありません。 'OnClickListener'インターフェースは' View'クラスの中で定義されているだけなので、 'View.OnClickListener'クラスを介してInterfaceにアクセスする必要があります。 (あなたは 'android.view.View.OnClickListener'をインポートし、' OnClickListener'を介してインターフェースにアクセスすることもできますが、それがいくつかのandriodコーディング規約に違反しているかどうかは分かりません) – pmnt

+0

ありがとう、私は明らかにJavaをたくさん学びます。 –

+2

@Elyas Machera - 私たちは、このキーワードは現在のクラスを指すようになります知っている我々はすべて、 – MByD

2

OnClickListenerはインターフェイスです。インタフェースは、他のクラスが実装できる一連のメソッドを提供します。 http://download.oracle.com/javase/tutorial/java/concepts/interface.html

あなたは、OnClickListenerを拡張する別のクラス(Likeとアダプタ)を持つことができます。その後、アダプタクラスはメソッド "OnClick(View v)"を追加でき、Clickイベントも処理できます。または、OnClickListenerを実装する、匿名のクラスを作成しただけで、投稿したコードを使用できます。

-Woody

+0

MByDは同じことをより明確な言語で説明しました。 – Woody

+0

ありがとう、私はリンクを読む。したがって、インタフェースは、それを拡張する他のクラスによって実装できる関数のリストを保持する別のクラスのようなものです。 したがって、ViewクラスはOnClickListenerインターフェイスを拡張するか、またはインターフェイスのメソッドですか? –

+1

このように考えてください。 Viewには、 "OnClickListener"インタフェースを実装するクラスが必要なローカル変数があります。 View.set ...メソッドを呼び出すと、それはあなたが提供したもので、その変数を "OnClickListener"を実装するクラス、または匿名クラス(あなたが元の投稿に持っているもの)で満たします。 ビューがクリックを処理するたびに、指定したクラスのOnClick関数を呼び出すことができます。 あなたの質問への回答としてsomeones replyをマークすることを忘れないでください(隣にある緑のチェックボックスをクリックしてください) – Woody

2

Androidコードはイベントベースの応答に対応しています。次のようにコードのブロックは、次のとおりです。

は、あなたがアクティブなレイアウトに追加したボタンを検索し、ローカル変数に割り当てます。

button1 = (Button) findByView(R.id.button1); 

は、ボタンのクリックリスナーに設定してください。これは、ボタンがイベントを登録するときに呼び出されるクラスです。クラスはここで構築されます。変数に代入しないので匿名ですが、アンドロイドは参照を追跡します。

ボタンイベントは常に押されているため、ボタンが押されたことを登録すると、onClickListenerクラスにそのイベントが発生したことが通知され、ビューとして渡されます。

のonClickメソッドを(この場合、ボタン押下)イベントを処理するリスナーによって使用されること
new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 

    } 
} 

:onClickListenerのように構成されています。だから、あなたはそのメソッドで実行したいコードを置くでしょう。

あなたの質問に直接答えるために、onClickListererはボタンイベントを処理するonClickメソッドを定義する匿名クラスです。

関連する問題