경험의 기록

BottomBottomNavigation 과 ViewPager2 를 사용하면 스와이프로 화면을 전환할 수 있는 바텀네비게이션을 만들 수 있다.

 


사용해보기

종속성 추가

android {

    buildFeatures {
        viewBinding true
    }
}

dependencies {

    // 뷰페이저 2
    implementation "androidx.viewpager2:viewpager2:1.0.0"
}

뷰바인딩과 뷰페이저2를 추가해준다.

 

 

바텀네비게이션 아이템 추가

바텀네비게이션을 사용하기 위해서는 그곳에서 사용할 아이템 메뉴를 추가해주어야 한다.

New -> Android Resource Directory 에서

 

typemenu로 하여 새로운 디렉토리를 추가해준다.

 

 

그 디렉토리에서 메뉴 리소스 파일을 생성하여

 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/item_one"
        android:title="One"
        android:icon="@mipmap/ic_launcher_round"/>
    <item android:id="@+id/item_two"
        android:title="Two"
        android:icon="@mipmap/ic_launcher_round"/>
    <item android:id="@+id/item_three"
        android:title="Three"
        android:icon="@mipmap/ic_launcher_round"/>

</menu>

사용할 아이템들을 작성해준다.

 

메인 레이아웃

<androidx.viewpager2.widget.ViewPager2
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigationView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:menu="@menu/bottom_navigation_item" />

뷰페이저2와 바텀네비게이션을 생성하고 app:menu로 아까 만든 메뉴를 연결해준다.

그 후, 임의의 프래그먼트를 3개 만든다.

 

뷰페이저 어댑터

class ViewPagerAdapter (fragment : FragmentActivity) : FragmentStateAdapter(fragment){
    override fun getItemCount(): Int = 3

    override fun createFragment(position: Int): Fragment {
        return when (position) {
            0 -> Fragment1()
            1 -> Fragment2()
            else -> Fragment3()
        }
    }
}

뷰페이저에 연결해주기 위한 어댑터를 만들어준다.

 

 

메인 액티비티

class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 페이저에 어댑터 연결
        binding.pager.adapter = ViewPagerAdapter(this)

        // 슬라이드하여 페이지가 변경되면 바텀네비게이션의 탭도 그 페이지로 활성화
        binding.pager.registerOnPageChangeCallback(
            object : ViewPager2.OnPageChangeCallback() {

                override fun onPageSelected(position: Int) {
                    super.onPageSelected(position)
                    binding.bottomNavigationView.menu.getItem(position).isChecked = true
                }
            }
        )

        // 리스너 연결
        binding.bottomNavigationView.setOnNavigationItemSelectedListener(this)
    }


    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.item_one -> {
                // ViewPager의 현재 item에 첫 번째 화면을 대입
                binding.pager.currentItem = 0
                return true
            }
            R.id.item_two -> {
                // ViewPager의 현재 item에 두 번째 화면을 대입
                binding.pager.currentItem = 1
                return true
            }
            R.id.item_three -> {
                // ViewPager의 현재 item에 세 번째 화면을 대입
                binding.pager.currentItem = 2
                return true
            }
            else -> {
                return false
            }
        }
    }
}

하나씩 살펴보면

 

BottomNavigationView.OnNavigationItemSelectedListener 을 상속받고, 뷰바인딩을 해준다.

 

아까 만든 뷰페이저 어댑터를 페이저에 연결해주고,

페이저의 OnPageChangeCallback 메소드를 사용하여 페이지가 변경되었을 때 바텀네비게이션도 선택되도록 한다.

 

아까 상속받은 BottomNavigationView.OnNavigationItemSelectedListener 에 대한 

onNavigationItemSelected 메소드를 구현하여 네비게이션에서 탭 선택 시 뷰페이저의 현재 선택값이 바뀌도록 한다.

그 후 리스너를 연결해준다.

 

 

 

하단 메뉴를 눌러서 이동하거나, 스와이프를 하여 양 옆으로 이동할 수 있는 레이아웃이 만들어진다.

 

github.com/HanYeop/AndroidStudio-Practice/tree/master/BottomNavigationEx

 

HanYeop/AndroidStudio-Practice

안드로이드 학습 내용 저장소. Contribute to HanYeop/AndroidStudio-Practice development by creating an account on GitHub.

github.com

 

 

 

 

 

참고

choheeis.github.io/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C/2020/03/01/BottomNavigationSwipe.html

 

 

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading