5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-11

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

ちなみにTabLayout.setOnTabSelectedListenerというのもあるらしいですが、公式ページにも書いてある通り現在(2018/02/12)は非推奨らしいのでaddOnTabSelectedListenerを使いましょう。

#実装
##build.gradle
公式ページの右上を見ると、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のドキュメントには
void addOnTabSelectedListener (TabLayout.OnTabSelectedListener listener)って書いてあるから、自分は最初tabLayout.addOnTabSelectedListener(TabLayout.OnTabSelectedListener {って書いてエラーを出してました。
エラーの内容はInterface OnTabSelectedListener does not have constructorsでした。
で、丸二日くらい悩んでどうしてもわからず、結局teratailで質問して上記の答えを得ました。
このobject:ってなんだ?と思って調べたところ、Kotlinの公式サイトによると無名クラスを作るのに使うキーワードだそうですね。

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

#まとめ
以下の概念(?)は重要

  • ラムダ式
  • SAM変換
  • Object expressions(オブジェクト式)
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?