【Lv1】イベントとリスナ【Android/Kotlin】







#環境
macOS Catalina version10.15.7
Android Studio 4.1.1
kotlin 1.4.10
実機: Pixel 4a (5G)

####コード
https://github.com/Ru-1218/CheckEnvironmentalProperty/blob/main/app/src/main/java/com/example/ru_1218/checkenvironmentalproperty/MainActivity.kt


##参考文献：
・基礎＆応用力をしっかり育成！Androidアプリ開発の教科書 Kotlin対応 なんちゃって開発者にならないための実践ハンズオン
  WINGSプロジェクト 齊藤 新三著 山田 祥寛 (監修)

#イベントとリスナって？




| 用語| 意味| 
|:-----------|------------:|
| イベント |ユーザー画面から受け取る何らかの操作のこと      | 
| イベントハンドラ | イベントを受け取って行う処理のこと    | 
| リスナ | イベントが発生するかどうか見張ってるもの | 



プロジェクトを作って自動生成されたコードを見てみると、onCreateメソッドがすでにありますね。
onCreateメソッドは、アプリが起動するとまず実行されるメソッドです。

今回作成するクリックイベントリスナもここに

```kotlin:MainActivity.kt
activity_main
override fun onCreate(savedInstanceState: Bundle?)
//oncreateメソッドはアプリが起動するとまず実行される
```


onCreateメソッドの外にクリックイベントに対する専用リスナを設定していきます。

```kotlin:MainActivity.kt
private inner class HelloListener : View.OnClickListener { 
//クリックイベントに対する専用リスナー
//リスナーは表示ボタンにイベントが発生するのを見守っている

   override fun onClick(v: View?) {
       TODO("Not yet implemented")
   }
}
```

それでは、oneCreateメソッド内にイベントハンドラを書いていきましょう。

```kotlin:MainActivity.kt
private inner class HelloListener : View.OnClickListener {  //クリックイベントに対する専用リスナー
   override fun onClick(v: View?) {
       //findViewByIdでこのIdを持つEditTextオブジェクトを取得
       val input = findViewById<EditText>(R.id.etName)

       //findViewByIdでこのIdを持つTextViewオブジェクトを取得 
       val output = findViewById<TextView>(R.id.tvOutput) 

       //入力受付
       val inputStr = input.text.toString()
            
       //出力
       output.text = inputStr + "さん、こんにちは！"
   } 
}
```

HelloListenerクラスは、クリックイベントに対する専用リスナーとして働きます。
イベントハンドラの処理は、
オブジェクトを取得->入力された文字列を取得->出力
といった流れです。


それでは、onCreateメソッド内にリスナを設定します。

```kotlin:MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) { //oncreateメソッドはアプリが起動するとまず実行される
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //リスナの設定
        val btClick = findViewById<Button>(R.id.btClick) //表示ボタンのオブジェクトを取得
        //消去イベント
        val btClear = findViewById<Button>(R.id.bt_clear) //消去ボタンのオブジェクトを取得

        val listener = HelloListener() //リスナクラスのインスタンスを作成
        btClick.setOnClickListener(listener) //表示ボタンにクリックイベントのリスナを設定
    }

```



##2個目のボタンイベントを追加

1個目同様に、onCreateメソッドにインスタンスを作成してリスナを設定します。

```kotlin:MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) { //oncreateメソッドはアプリが起動するとまず実行される
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //リスナの設定
        val btClick = findViewById<Button>(R.id.btClick) //表示ボタンのオブジェクトを取得
        //消去イベント
        val btClear = findViewById<Button>(R.id.bt_clear) //消去ボタンのオブジェクトを取得

        val listener = HelloListener() //リスナクラスのインスタンスを作成
        btClick.setOnClickListener(listener) //表示ボタンにクリックイベントのリスナを設定
        btClear.setOnClickListener(listener) //消去ボタンイベントのリスナを設定
    }
```


2個目のボタンに対するクリックイベントもHelloListenerクラスを使うもですが、whenを使ってボタンにつけたidによって処理を分けるようにしてみましょう。

HelloListennerクラスの中に記述します。

```kotlin:MainActivity.kt

if (v != null) {
                when(v.id){
                    //表示ボタンの場合
                    R.id.btClick->{
                        val inputStr = input.text.toString()
                        output.text = inputStr + "さん、こんにちは！！"
                    }

                    //消去ボタンの場合
                    R.id.bt_clear ->{
                        //入力欄を空
                        input.setText("")
                        //メッセージ表示欄を空文字に設定
                        output.text = ""
                    }
                    
                }
            }
```