Tablayout은 기본적으로 제공되지 않기 때문에 라이브러리를 가져와야 한다.
implementation 'com.google.android.material:material:1.3.0'
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TabPagerActivity"
android:orientation="vertical">
<!-- TabLayout -->
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<!-- ViewPager -->
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
class PagerAdapter(
fragmentManager: FragmentManager,
val tabCount: Int
): PagerStatePagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT){
// tab들의 개수를 리턴
override fun getCount(): Int {
return tabCount
}
// position에 따른 fragment를 리턴해준다.
override fun getItem(position: Int): Fragment {
return when(position){
0 -> {
FragmentFirst()
}
1 -> {
FragmentSecond()
}
2 -> {
FragmentThird()
}
else -> {
FragmentFirst()
}
}
}
}
BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
- 현재 프래그먼트만 RESUMED 상태에 있고, 나머지 프래그먼트들은 STARTED 상태에 남아있는다.
val tabLayout: TabLayout = findViewById(R.id.tab_layout)
tabLayout.addTab(tabLayout.newTab().setText("One"))
tabLayout.addTab(tabLayout.newTab().setText("Two"))
tabLayout.addTab(tabLayout.newTab().setText("Three"))
val pagerAdapter = PagerAdapter(supportFragmentManager, 3)
val viewPager: ViewPager = findViewById(R.id.view_pager)
viewPager.adapter = pagerAdapter
tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener{
// tab이 클릭되면 viewPager의 현재 아이템을 변경
override fun onTabSelected(tab: TabLayout.Tab?) {
viewPager.currentItem = tab!!.position
}
// override fun onTabUnselected(tab: TabLayout.Tab?) {
//}
// override fun onTabReselected(tab: TabLayout.Tab?) {
//}
})
// page가 바뀌면 tabLayout도 변하도록
viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout))
class ThreePagerAdapter(
val layoutInflater: LayoutInflater
): PagerAdapter(){
// 뷰를 그려주는 부분
override fun instantiateItem(container: ViewGroup, position: Int): Any {
when(position){
0 -> {
val view = layoutInflater.inflate(R.layout.fragment1,container, false)
container.addView(view)
return view // 이게 나중에 파라미터로 전달되는 `object`
}
1 -> {
val view = layoutInflater.inflate(R.layout.fragment2,container, false)
container.addView(view)
return view
}
2 -> {
val view = layoutInflater.inflate(R.layout.fragment3,container, false)
container.addView(view)
return view
}
else -> {
val view = layoutInflater.inflate(R.layout.fragment1,container, false)
container.addView(view)
return view
}
}
}
// 해당 view가 가려질 때 호출된다.
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
// container에서 아이템 떼어내기
container.removeView(`object` as View)
}
// viewPager에 있는 page 개수
override fun getCount(): Int {
return 3
}
// 여기서 view는 현재 보고있는 view가 현재 원하는 view가 (`object`)가 맞는지 확인
override fun isViewFromObject(view: View, `object`: Any): Boolean {
return view === `object` as View
}
}