ViewであればsetOnLongClickListener
をセットすればよいのですが、TabLayoutにはそういったリスナーをセットするメソッドがありませんでしたので、長押し時のリスナーのセットのしかたを試してみました。※pagerは使いません。
ClickとLongClick
準備
val tabLayout = findViewById<TabLayout>(R.id.tab_layout)
tabLayout.apply {
addTab(tabLayout.newTab().setText("タブ1"))
addTab(tabLayout.newTab().setText("タブ2"))
}
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorHeight="0dp"/>
Click
タブをタップしたときの処理はそのままリスナーがセットできます。
tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
when (tab.position) {
0 -> {/*タブ1のClick処理*/}
1 -> {/*タブ2のClick処理*/}
}
}
override fun onTabReselected(tab: TabLayout.Tab) {}
override fun onTabUnselected(tab: TabLayout.Tab) {}
})
LongClick
長押しはそのままセットできなかったので、タブレイアウトからViewを取り出してセットします。
val tabs = tabLayout.getChildAt(0) as ViewGroup
for (i in 0 until tabs.childCount) {
tabs.getChildAt(i).setOnLongClickListener {
when (i) {
0 -> {/*タブ1のLongClick処理*/}
1 -> {/*タブ2のLongClick処理*/}
else -> {}
}
false
}
}
最後に
ふと使う必要がでたものの、こういった実装方法しか思いつきませんでした。
単にクリックしたいときも同じところを連続でタップすると1回目はonTabSelected
ですが、二回目はonTabReselected
にコールバックするので普通のクリック処理も中のViewにリスナー付けたりしてます。
TabLayoutの使い方としてはあまり正しくないのかもしれないです。