2012-01-23 14 views
57

可能性の重複:
Difference between OnClick() event and OnClickListener?ボタンをクリックしてリスナー

私はAndroidの開発に半新たなんだと私が最初に始めたとき、私はどんなことで、XMLレイアウトを使用しないようにしようとしました私の以前のプロジェクトの中には、明示的にOnClickListenerを作成し、それを匿名の内部クラスとして実装するボタンを必要とするものがいくつかあります。など -

final Button button = new Button(this); 
button.setText("Click to change second line of text"); 

OnClickListener buttonListener = new View.OnClickListener() { 
    boolean clicked = false; 
    int numClicks = 0; 

    @Override 
    public void onClick(View v) { 
     if(numClicks > 5) { 
      button.setText("STOP IT"); 
     } 
     numClicks++; 
     if(clicked == false){ 
      clicked = true; 
      tv2.setText("Text Changed on Button Click");  
     } 
     else 
     { 
      clicked = false; 
      tv2.setText("Click again"); 
     }  
    } 
}; 
button.setOnClickListener(buttonListener); 

しかし、私はアンドロイドに詳しくなったとして、私は、XMLレイアウトの価値を理解し始めたとドイトが定義されたレイアウトXMLでは、この

<Button 
    android:id="@+id/button1" 
    android:layout_height = "wrap_content" 
    android:layout_width ="wrap_content" 
    android:text = "lets do this" 
    android:onClick = "DoIt" 
    /> 

のようなボタンを実装Javaで。

私の質問は、これら2つの方法は機能的に同じですか? OnClickListenerは、舞台裏でコンパイラによって定義されていますか?一方的なやり方でトレードオフする機能はありますか?

+1

を処理する継承されたメソッドonClick()を追加する必要がOnClickListenerを実装する場合、変数Button button1;は、あなたのonCreate()

button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(this); 

にこれを追加追加しているのはここに有用な議論であります](http://stackoverflow.com/a/7453469/1154026)私はあなたの質問に役立つと思う。 – VicVu

+0

クリックリスナを設定するには、3つの方法があります。1.各要素のクリックリスナを個別に設定する。アクティビティでOnClickListenerを実装する。 3.ボタンクリックを処理するための別の関数を作成し、この関数をxmlに追加します。これらの例はここにありますhttp://wiki.workassis.com/android-three-ways-to-set-click-listener/ –

答えて

139

これらはまったく同じです。 がAPIレベル4で追加され、より簡単になり、JavascriptとWebのように多くなり、XMLのすべてが駆動されます。内部的には、DoItメソッドを呼び出すButtonにOnClickListenerを追加します。

Button button= (Button) findViewById(R.id.buttonId); 
button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     DoIt(v); 
    } 
}); 

あなたは、XML構成といつものように、を使用することによってトレードオフ唯一のもの、それはプログラム的に(動的なコンテンツを追加するために少しより困難になるということである。ここでは

android:onClick="DoIt"を使用すると、内部的に何をするかです変数に応じて1つのリスナーまたは別のリスナーを追加することもできます)。しかしこれは、DoItの方法であなたのテストを加えることによって簡単に打ち負かされます。

+0

優れた答えです。 XML経由でコールバックを設定する際にAndroidが何をしているのかを説明してくれてありがとう。 –

+5

'android:onClick'はフラグメントに定義されたメソッドでは動作しません。最も良い解決策は、断片内にリスナーを付けることです。詳細はhttp://stackoverflow.com/questions/6091194/how-to-handle-button-clicks-using-the-xml-onclick-within-fragments – adamdport

+0

簡単な説明をありがとう。 – JoeYo

0

XMLでandroid:onClick = "DoIt"を定義していても、アクティビティ(またはビューコンテキスト)に、完全に同じ名前とビューのパラメータとして定義されたパブリックメソッドがあることを確認する必要があります。 Androidはあなたの定義をアクティビティのこの実装に結び付けます。最後に、実装では、匿名の内部クラスで記述したコードと同じコードを使用します。したがって、単純な言葉ではなく、内部クラスとリスナーをアクティビティに添付する代わりに、実装コードを持つパブリックメソッドを持つだけです。

+1

私はそれが私のJavaに実装されている、私はちょうど方法は質問に関連していなかったので、それを投稿していない。 – SmashCode

2

XMLを使用する場合は、自分でonclickリスナーを設定する必要があります。ファーストクラスimplements OnClickListenerが、その後あなたは[あなたのクリック

関連する問題