본문 바로가기
Develop/Android

TabLayout과 ViewPager 연동하기

by 라이프레이서 2019. 12. 21.

목차

    반응형

    1. 레이아웃 구성하기

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/TabTheme">
    
            <android.support.design.widget.TabLayout
                android:id="@+id/tab_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
    
        </android.support.design.widget.AppBarLayout>
    
        <android.support.v4.view.ViewPager
            android:id="@+id/view_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    </android.support.design.widget.CoordinatorLayout>

    AppBar영역 안에 TabLayout을 넣어주고, 아래에 ViewPager 넣어준 activity_main.xml이다.

     

    아래는 해당 AppBar의 스타일에 해당하는 부분이다.

    <style name="TabTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <item name="colorPrimary">@color/colorPrimary</item>                                <!-- 배경 -->
    
            <item name="android:textColorPrimary">@android:color/white</item>       <!-- 탭바 선택된 텍스트 -->
            <item name="android:textColorSecondary">@android:color/black</item>     <!-- 탭바 텍스트 -->
    
            <item name="colorAccent">@android:color/white</item>                    <!-- 하단 움직이는 바 색-->
        </style>

     

    2.  ViewPager에 대한 Adapter 생성하기

    class MainAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
    
        override fun getItem(position: Int): Fragment? {
            return when(position) {
                0 -> AFragment()
                1 -> BFragment()
                2 -> CFragment()
                3 -> DFragment()
                else -> null
            }
        }
        // 생성 할 Fragment 의 개수
        override fun getCount() = 4
    
        override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
            super.destroyItem(container, position, `object`)
        }
    
        override fun getPageTitle(position: Int): CharSequence? {
            return null
        }
    
    }

    Fragment를 이용하여 PagerAdapter를 적용할 것이라 FragmentStatePagerAdapter를 받고

     

    3. Fragment 생성하기

    Fragment는 총 4개를 생성해줄 건데 레이아웃 파일은 fragment_main.xml로 하나만 만든다.

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/tv_fragment"
            android:textSize="20dp"
            android:textStyle="bold"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toTopOf="parent"/>
    
    </android.support.constraint.ConstraintLayout>

    아래는 클래스. A Fragment 부분을 B Fragment, C Fragment, D Fragment 이런식으로 4개의 클래스를 만들어준다.

    class AFragment : Fragment() {
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.fragment_main, container, false)
        }
    
        override fun onActivityCreated(savedInstanceState: Bundle?) {
            super.onActivityCreated(savedInstanceState)
    
            //뷰 설정
            tv_fragment.text = "A Fragment"
    
        }
    
    }

    4. MainActivity에서 적용하기

    class MainActivity : AppCompatActivity() {
    
        private val adapter by lazy { MainAdapter(supportFragmentManager) }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            // 뷰페이저 어댑터 연결
            view_pager.adapter = MainActivity@adapter
    
            view_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener{
                override fun onPageScrollStateChanged(state: Int) {
                }
    
                override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
                }
    
                override fun onPageSelected(position: Int) {
    
                    tab_layout.getTabAt(0)?.setIcon(R.drawable.ic_music)
                    tab_layout.getTabAt(1)?.setIcon(R.drawable.ic_chat)
                    tab_layout.getTabAt(2)?.setIcon(R.drawable.ic_image)
                    tab_layout.getTabAt(3)?.setIcon(R.drawable.ic_person)
    
                    when(position) {
                        0 -> tab_layout.getTabAt(0)?.setIcon(R.drawable.ic_music_white)
                        1 -> tab_layout.getTabAt(1)?.setIcon(R.drawable.ic_chat_white)
                        2 -> tab_layout.getTabAt(2)?.setIcon(R.drawable.ic_image_white)
                        3 -> tab_layout.getTabAt(3)?.setIcon(R.drawable.ic_person_white)
                    }
                }
            })
            // 탭 레이아웃에 뷰페이저 연결
            tab_layout.setupWithViewPager(view_pager)
    
            // 탭 레이아웃 초기화
            tab_layout.getTabAt(0)?.setIcon(R.drawable.ic_music)
            tab_layout.getTabAt(1)?.setIcon(R.drawable.ic_chat)
            tab_layout.getTabAt(2)?.setIcon(R.drawable.ic_image)
            tab_layout.getTabAt(3)?.setIcon(R.drawable.ic_person)
        }
    }

    설정했던 것들 적용하면 끝난다.

    만들어진 클래스와 drawable, layout파일들이다.

     

    아래는 구현된 화면!

     

    반응형