Android Studioでボタン(Button)をクリックするイベントを作る
Androidアプリに限らず多くのアプリはボタンをユーザーが押すことで何かしらのアクションが起こるようになっています。ボタン押下時のアクションはイベントと呼ばれます。
当記事ではAndroidアプリでボタンをクリックして何かしらのイベントを発生させる方法を解説します。
目次 Table of Contents
ボタン(Button)クリックイベントの基本的なコードの書き方
ボタンクリックイベントのサンプルとして、ButtonをクリックするとTextViewの文字が変わるイベントを作成してみます。
MainActivity.java
package com.example.samplebuttonivent;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//ボタンを設置
Button button01 = findViewById(R.id.button01);
//ボタン押下時のイベント
button01.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
TextView textView01 = findViewById(R.id.text_view01);
textView01.setText(“pushed button01 !”);
}
});
}
}
activity_main.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:orientation=”vertical”
tools:context=”.MainActivity” >
<LinearLayout
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:gravity=”center”
android:orientation=”vertical” >
<TextView
android:id=”@+id/text_view01″
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”before push button”
android:background=”#9999ff”
/>
<Button
android:id=”@+id/button01″
android:layout_width=”200dp”
android:layout_height=”40dp”
android:text=”Push !”
/>
</LinearLayout>
</LinearLayout>
以下をインポートします。
- android.view.View
- android.widget.TextView
- android.widget.Button
onClick()メソッドに、ボタンクリック時に実行したいイベントを書いていきます。ここではTextViewの文字を変化させる処理を書きました。
ボタン操作イベントは一般的にこの書き方で解説してあることが多いですが、Javaの匿名クラスを使った書き方なので分かりづらいかもしれません。次項では同じ処理の別の書き方を紹介します。
イベントリスナクラスを定義してインスタンス化する
Javaの匿名クラスを使わないやり方です。View.OnClickListenerインタフェースを実装したクラスを作り、そのクラスのインスタンスを引数にしてsetOnClickListener()メソッドを呼び出しています。View.OnClickListenerはabstractなonClickメソッドを持っていますのでこれをオーバーライドすることで実装できます。
package com.example.samplebuttonivent;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//ボタンを設置
Button button01 = findViewById(R.id.button01);
ListenerClickButton listener = new ListenerClickButton();
button01.setOnClickListener(listener);
}
private class ListenerClickButton implements View.OnClickListener{
@Override
public void onClick(View view){
TextView textView01 = findViewById(R.id.text_view01);
textView01.setText(“pushed button01 !”);
}
}
}
リスナクラスを使った書き方は処理がわかりやすい反面、ボタンの数が増えるとコードも長くなってしまいます。またリスナクラスはコード下部に書かれるため、ボタン部分と離れた位置に書かれることになりますね。
匿名クラスによる書き方が好まれるのはそのような冗長さを解消するためです。
なおここではMainActivity内にプライベートなリスナクラスを定義していますが、外部クラスに分けることもできます。ですがActivityでない通常のクラスからボタンなどのビューを操作するには別の処理をする必要があります。そちらは別の記事で紹介します。
匿名クラス(無名クラス)を変数に代入する
これは最初のコードとほとんど同じですが、匿名クラスをいったん変数に代入してから利用しています。Javaの匿名クラスは変数に代入することができますし、自身を参照とすることもできます。
package com.example.samplebuttonivent;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//ボタンを設置
Button button01 = findViewById(R.id.button01);
View.OnClickListener listener = new View.OnClickListener(){
@Override
public void onClick(View view){
TextView textView01 = findViewById(R.id.text_view01);
textView01.setText(“pushed button !”);
}
};
button01.setOnClickListener(listener);
}
}
変数を使わない場合と同じことをしていますが、あえて変数を増やす必要がない場面では直接参照の形で書いた方がスッキリします。ある処理を複数の場所で使い回すときは変数に代入した方が便利ですが、ボタン押下イベントなどはそのボタンだけに設定される処理なので変数を使う必要がない、というわけです。