web-dev-qa-db-ja.com

OnClickListenerインターフェイスの使用は、XMLコードとJavaコードを使用してどのように異なりますか?

可能性のある複製:
OnClick()イベントと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);

しかし、Androidに精通するにつれて、xmlレイアウトの価値とこのような実装されたボタンを理解し始めました

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

DoItがJavaで定義されたレイアウトxml。

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

67
SmashCode

これらはまったく同じです。 Android:onClickがAPIレベル4に追加され、より簡単に、よりJavascript-webに似たものになり、XMLからすべてを駆動しました。内部的には、ボタンにOnClickListenerを追加し、DoItメソッドを呼び出します。

以下はAndroid:onClick="DoIt"を使用して内部的に行うことです。

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

Android:onClickを使用してトレードオフする唯一のことは、XML構成の場合と同様に、動的コンテンツの追加が少し難しくなることです(プログラムにより、変数に応じてリスナーを追加することもできます)。ただし、これはDoItメソッド内にテストを追加することで簡単に無効になります。

161
Guillaume

xMLを使用して、onclickリスナーを自分で設定する必要があります。最初にクラスimplements OnClickListenerを用意し、次に変数Button button1;を追加してから、これをonCreate()に追加します

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

onClickListenerを実装する場合、クリックを処理する継承メソッドonClick()を追加する必要があります

4
Bill Gary

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

2
kosa