onClickとOnClickListenerの違い

ボタンを押したときに呼び出すメソッドの指定は XML 側と Java 側どちらにも実装できますが,リスナーを使うことが推奨されています.

何が違うんだ?と思ったら,Udacity で取り上げられていました.

onClick

レイアウトファイルの XML 側で実装する場合は onClick 属性で呼び出します.

※ View.OnClickListener のメソッドの方ではないです.

activity_main.xml

<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:onClick="clickButton" />

MainActivity.java

public void ClickButton(View view) {
    // do something when the button is clicked
}

OnClickListenter

一方,View.OnClickListenter を使って Java 側で実装する場合は,さっきより複雑になります.

activity_main.xml

<Button
    android:id="@+id/button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />

ClickListener.java

public class clickListener implements View.OnClickListener {

    @Override
    public void onClick(View view) {
        // do something when the button is clicked
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button);

        // Set a click listener on that View
        button.setOnClickListener(new ClickListener());
    }
}

こうすることで,ボタンがクリックされたときに onClick メソッドが処理されるようになります.見やすいように敢えて分けてみましたが,下のようにまとめて書くことが多いようです.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button);

        // Set a click listener on that View
        button.setOnClickListener(new View.OnClickListener{

            @Override
            public void onClick(View view) {
                // do something when the button is clicked
            }
    });
}

リスナーが推奨される理由

onClick 属性を用いたほうが簡潔にコーディングできて見やすいのですが,リスナーを使うのが一般的です.

その理由として,onClick 属性でメソッドを指定した場合,どのファイル内のメソッドかというのが問題になることが挙げられます.リスナーで実装する方式にすれば,呼び出されるメソッドはそのファイル内に限られるので問題になりません.なるほど.

最後に

あと,蛇足ですが,このブログにソースコードを埋め込むのに使ってる Crayon Syntax Highlighter は Android も XML もハイライト非対応なんですね,Arduino には対応してるのに!