AndroidStudioでイベントを受信する
ボタンをクリックしたらHello World!を書き換えるアプリを作ってみましょう。
新規プロジェクトで空のアクティビティを作ります。
<TextView
android:id="@+id/tvMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button"/>
TextViewに idを追加
Buttonを追加して id を追加します。
警告が出ますが今回はこれで進めます。
先に実行するイベントを書いてしまいます。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun onButtonClick(view : View){
val tvMain = findViewById<TextView>(R.id.tvMain)
tvMain.setText("Button Click!")
}
}
警告と Alt + Enter という表示が出ます。
AndroidStudioでは外部クラスや外部関数が必要な場合には Alt + Enter を押すと自動的にimport文を追加されます。
import文は普段非表示で1行のみ表示されていますのでその左側の「+」で展開しましょう。
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
初期は3行あります。灰色になっているのは「使われてない」ことを表しています。
importを追加してみましょう。
警告が出ているview : Viewにカーソルを合わせてAlt+Enterを押すと
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.TextView
1行増えて警告が無くなりました。
~ 省略 ~
<Button
android:id="@+id/btMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onButtonClick"
android:text="Button"/>
onClickに作ったイベントを割り当てます。
これを実行すると表示されたボタンを押すことでButton Clickと表示されるようになります。
VisualBasicやDelphiに慣れた人にはこれが最もわかりやすい例だと思われます。
リスナーを使う
xmlに書いたandroid:onClick="onButtonClick"を削除します。
MainActivity.kt に書いた**fun onButtonClick(view : View){**以下を消します。
代わりに
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
val listener = object:View.OnClickListener {
override fun onClick(v: View?) {
val tvMain = findViewById<TextView>(R.id.tvMain)
tvMain.setText("Button Click!")
}
}
}
のようにリスナーを追加します。
これだけではまだイベントは機能しません。
onCreateイベント内でリスナーを登録します。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button: Button = findViewById<Button>(R.id.btMain) as Button
button.setOnClickListener(listener)
}
val listener = object:View.OnClickListener {
override fun onClick(view: View?) {
val tvMain = findViewById<TextView>(R.id.tvMain)
tvMain.setText("Button Click!")
}
}
}
さきほどほんの数行で実行出来たのがわかりづらくなりましたが、こちらが本来の記述方式です。
プログラム | 意味 |
---|---|
val listener = object:View.OnClickListener { | object.viewが持つOnClickListenerクラスを定義します。 |
override fun onClick(view: View?) | OnClickListenerクラスには必ず継承しないといけないメソッド(関数)があるのでそれを継承(override)します |
button.setOnClickListener(listener) | ボタンにリスナーを登録します |
この例ではリスナーを使わずに記述する方式の方が優れているようにみえますがボタンをクリックする以外の場合はリスナーを使ったやり方を使うことになりますので必ず覚えておきましょう。
最後に
fun onButtonClick(view : View)と宣言してxml上のonClickで指定するのはわかりやすいですが細かいことをしようとするとリスナーを覚えていく必要があります。
リスナーとしてval listener = object:View.OnClickListener {と定義したクラス内部で補完機能を使うとオーバーライドに必要な宣言を自動的に入力してくれるのですが、なにせどのクラスにどのリスナーがあって、どのメソッドを継承しないといけないのかなどの情報が少なすぎますね。
その辺のコツがわかり次第更新します。