KotlinでOnTabSelectedListenerを使ってタグが選択されたのを検知する方法

#この記事は？
Kotlinを使ってアンドロイドアプリの開発をしています。
作成中のアプリのUIにはタグが存在し、その挙動は[TabLayout](https://developer.android.com/reference/android/support/design/widget/TabLayout.html)を用いて実装しました。
作成時はいろんなサイトを調べまわったのですが、TabLayoutは基本的にViewPagerと一緒に使うことを前提としたものが多く、またそうでないのも若干古いのが多かったです。
そこで、TabLayoutの[addOnTabSelectedListener](https://developer.android.com/reference/android/support/design/widget/TabLayout.html#addOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener))を用いてタブの選択状態が変化したのをキャッチする実装を紹介します。

<font color="DarkGray">ちなみに[TabLayout.setOnTabSelectedListener](https://developer.android.com/reference/android/support/design/widget/TabLayout.html#setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener))というのもあるらしいですが、公式ページにも書いてある通り現在(2018/02/12)は非推奨らしいのでaddOnTabSelectedListenerを使いましょう。</font>

#実装
##build.gradle
[公式ページの右上](https://developer.android.com/reference/android/support/design/widget/TabLayout.html)を見ると、TabLayoutは"com.android.support:design:27.0.0"だそうなので、build.gradleに追加します。

```build.gradle
dependencies {
    // ここにはimplementationとかがあるが、省略

　　// ↓自分が追加したもの
    compile 'com.android.support:appcompat-v7:23.1.0'
    compile 'com.android.support:design:27.0.0' // design support library
}
```
ちなみに、Android Studioの左側のプロジェクトビューを”Android"に設定していると、"build.gradle"というファイルが以下のように二つありますが、ここでは下のbuild.gradle(Module: app)のことを指しています。
　・build.gradle(Project: アプリ名)
　・build.gradle(Module: app)

##MainActivity.kt
// importは省略

```MainActivity.kt
class MainActivity :  AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // activity_main.xmlのid="@+id/tabs"のTabLayout要素にタブ本体が乗る
        var tabLayout = findViewById<TabLayout>(R.id.tabs)

        tabLayout.addTab(tabLayout.newTab().setText("タブ1"))
        tabLayout.addTab(tabLayout.newTab().setText("タブ2"))

        // "object:" ← 無名クラスを作るときに使う
        tabLayout.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener {
            // "onTabSelected","onTabUnselected","onTabReselected"の3つを実装しないとエラー
            override fun onTabSelected(tab: TabLayout.Tab) {
                Log.i("myTag", "onTabSelebted")
            }

            override fun onTabUnselected(tab: TabLayout.Tab) {
                Log.i("myTag", "onTabUnselected")
            }

            override fun onTabReselected(tab: TabLayout.Tab) {
                Log.i("myTag", "onTabReselected")
            }
        })
    }
}
```
自分のようなど素人が一番つまずくのは「object: TabLayout.OnTabSelectedListener」の部分だと思います。
[TabLayout.addOnTabSelectedListenerのドキュメント](https://developer.android.com/reference/android/support/design/widget/TabLayout.html#addOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener))には
```void addOnTabSelectedListener (TabLayout.OnTabSelectedListener listener)```って書いてあるから、自分は最初```tabLayout.addOnTabSelectedListener(TabLayout.OnTabSelectedListener {```って書いてエラーを出してました。
エラーの内容は```Interface OnTabSelectedListener does not have constructors```でした。
で、丸二日くらい悩んでどうしてもわからず、結局[teratailで質問](https://teratail.com/questions/112989?whotofollow=)して上記の答えを得ました。
この```object:```ってなんだ？と思って調べたところ、[Kotlinの公式サイト](https://kotlinlang.org/docs/reference/object-declarations.html)によると無名クラスを作るのに使うキーワードだそうですね。

色々調べてたら[毎日Kotlinの１２日目の記事](https://dev.classmethod.jp/smartphone/kotlin-everyday-12/)に思いっきりお手本となりそうなコードが乗ってました。
(追記：↑を試したのですが、onClickListenerはButtonクラスのメソッドであるため、tabLayoutでは使えませんでした。)

#まとめ
以下の概念(？)は重要
- ラムダ式
- SAM変換
- Object expressions(オブジェクト式)