Buttonにタップ時の処理を実装する方法をご紹介します。
実装によって6パターン程、方法があるのであなたの実装によって使いやすい
パターンを使用してみてください。
匿名クラス(無名クラス)を使用する
まず、ひとつめは匿名クラスを使用する方法です。
個人意見ですがGitHub等でよく見かける実装の一つです。
匿名クラス(無名クラス)を使用する事で「インスタンス生成」と「クラスの定義」を同時に行えます。
// Buttonのインスタンスを取得
Button button = findViewById(R.id.button);
// OnClickEventを設定する
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// ボタンタップ時に処理したい事をonClick内に記述する
}
});
// Buttonのインスタンスを取得
val button = findViewById<Button>(R.id.button)
// OnClickEventを設定する
button.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
// ボタンタップ時に処理したい事をonClick内に記述する
}
})
匿名クラス(無名クラス)を使用する(ラムダ式を利用)
ひとつめの実装はラムダ式を利用すると省略して実装できるのでおすすめです。
ラムダ式とはJava 8で追加された関数型インターフェースを簡潔に記述できる機能です。
※Javaのラムダ式を利用する場合はJavaのバージョンが8以上である必要あります
// Buttonのインスタンスを取得
Button button = findViewById(R.id.button);
// OnClickEventを設定する
button.setOnClickListener(v -> {
// ボタンタップ時に処理したい事をonClick内に記述する
});
// Buttonのインスタンスを取得
val button = findViewById<Button>(R.id.button)
// OnClickEventを設定する
button.setOnClickListener {
// ボタンタップ時に処理したい事をonClick内に記述する
}
View.OnClickListenerを変数化
上記で紹介した匿名クラス(無名クラス)を変数に代入することにより
View.OnClickListenerを再利用できるようになります。
// View.OnClickListenerを変数化
View.OnClickListener clickListener = v -> {
// ボタンタップ時に処理したい事をonClick内に記述する
};
// Buttonのインスタンスを取得
Button button = findViewById(R.id.button);
// OnClickEventを設定する
button.setOnClickListener(clickListener);
// View.OnClickListenerを変数化
val clickListener = View.OnClickListener {
// ボタンタップ時に処理したい事をonClick内に記述する
}
// Buttonのインスタンスを取得
val button = findViewById<Button>(R.id.button)
// OnClickEventを設定する
button.setOnClickListener(clickListener)
使用クラスにView.OnClickListenerを実装する
続いては使用クラスにView.OnClickListenerを実装する方法です。
ボタンタップ時の処理をメソッド化することにより実装をひとまとめにできるので
同じボタンタップ時の処理のボタンが複数ある場合に使用されたりします。
// View.OnClickListenerを実装する
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
...
// Buttonのインスタンスを取得
Button button = findViewById(R.id.button);
// OnClickEventを設定する
button.setOnClickListener(this);
...
@Override
public void onClick(View v) {
// ボタンタップ時に処理したい事をonClick内に記述する
}
// View.OnClickListenerを実装する
class MainActivity : AppCompatActivity(), View.OnClickListener {
...
// Buttonのインスタンスを取得
val button = findViewById<Button>(R.id.button)
// OnClickEventを設定する
button.setOnClickListener(this)
...
override fun onClick(v: View?) {
// ボタンタップ時に処理したい事をonClick内に記述する
}
カスタムクラスを作成する
次はカスタムクラスを作成する方法です。
カスタムクラスはクラスを作成する手間はありますが
他の画面のボタンのタップ時の処理と共通化することができます。
// カスタムクラスを定義する
public class CustomClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
// ボタンタップ時に処理したい事をonClick内に記述する
}
}
...
// Buttonのインスタンスを取得
Button button = findViewById(R.id.button);
// OnClickEventを設定する
button.setOnClickListener(new CustomClickListener());
// カスタムクラスを定義する
class CustomClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
// ボタンタップ時に処理したい事をonClick内に記述する
}
}
...
// Buttonのインスタンスを取得
Button button = findViewById(R.id.button);
// OnClickEventを設定する
button.setOnClickListener(new CustomClickListener());
レイアウトxmlにクリックイベントを設定する
最後はレイアウトxmlにクリックイベントを定義する方法です。
android:onClickに自身で作成したメソッドを記述することで利用可能です。
利用するには条件があります。
- 自身で作成したメソッドのアクセス修飾子はpublicであること
- 自身で作成したメソッドのVIewの引数のみであること
レイアウトxmlに下記を記述します。
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="clickEvent" /> <- OnClickEventを設定する
public void clickEvent(View v) {
// ボタンタップ時に処理したい事をonClick内に記述する
}
fun clickEvent(v: View?) {
// ボタンタップ時に処理したい事をonClick内に記述する
}
個人的意見ですがレイアウトxmlにクリックイベントを定義する方法は
あまり見かけないような気がします。。。
最後に
6パターン程、Buttonにタップ時の処理を実装する方法を紹介しましたがいかがでしたでしょうか?
実装においてベストプラクティスがあるので一概に「これが一番使う!」とは言えないです。。
みなさんも色々な実装を試してみてください!
コメント