#この記事は?
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に追加します。
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は省略
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(オブジェクト式)