greenhelix
greenhelix
greenhelix
06-22 02:44
  • All (229)
    • Algorithm (118)
      • Algorithm (17)
      • Graph (0)
      • Core (6)
      • Python (18)
      • PythonSnippet (4)
      • Java (59)
      • Kotlin (14)
    • Project (0)
    • Study (8)
      • License (5)
      • EIP (3)
    • Programming (63)
      • Android (41)
      • Flutter (1)
      • Bugs Life (21)
      • Linux (0)
    • Tech (32)
      • Tech (17)
      • Drone (4)
      • Hacking (11)
    • Life (6)
      • INGRESS (1)
      • 심시티빌드잇 (0)
250x250

티스토리

hELLO · Designed By 정상우.
greenhelix

greenhelix

[BottomNavigation] ViewPager2 적용
Programming/Android

[BottomNavigation] ViewPager2 적용

2021. 6. 9. 01:35

 먼저 참고할 문서 

- ViewPager2 [보러가기]

- ViewPager2 사용가능 메서드 [보러가기]

- 정리가 잘된 블로그 [보러가기]

 

 

기본 설정  

0. gradle 확인 androidx.viewpager2.widget.VieaPager2 가 import되는지 확인해본다. (웬만하면 들어있는듯)

1. menu xml 생성 후 원하는 item 메뉴의 종류를 만든다. 

- icon, title까지 다 설정해주고, enabled = true를 해준다.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/nav_map"
        android:enabled="true"
        android:icon="@drawable/ic_baseline_map_24"
        android:title="지도"
        />

    <item
        android:id="@+id/nav_record"
        android:enabled="true"
        android:icon="@drawable/ic_baseline_note_add_24"
        android:title="기록"
        />
    <item
        android:id="@+id/nav_list"
        android:enabled="true"
        android:icon="@drawable/ic_baseline_format_list_bulleted_24"
        android:title="리스트"
        />
    <item
        android:id="@+id/nav_setting"
        android:enabled="true"
        android:icon="@drawable/ic_baseline_settings_24"
        android:title="설정"
        />
</menu>

2. 해당 layout파일로 가서 보여질 화면 ViewPager2와 bootttomnavigationview를 만들어준다. 

- id를 꼭 만든다. 

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
        app:layout_constraintTop_toTopOf="parent" />

3. 해당 Activity로 이동하여 설정한 메뉴들과 화면을 연동해준다. 

- ViewBinding을 사용하였다. (findviewbyid 대신 사용하는 것임.)

- Kotlin 을 사용하였다.

- Fragment를 사용하였다. 

class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
	
    //ViewBinding 선언
    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // ViewBinding 정의 구간
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        
		// bottom 네비리스너 설정
        binding.bottomNavigationView.setOnNavigationItemSelectedListener(this)
        
        // adapter설정
        binding.보여질화면ID.adapter = ViewPagerAdapter(supportFragmentManager, lifecycle)
        
        // callback설정
        binding.보여질화면ID.registerOnPageChangeCallback(ViewPagerPageChangeCallback())
    }

 

 

기억해야할 메서드이다.

1) onNavigationItemSelected()

2) ViewPagerAdapter()

3) ViewPagerPageChangeCallback() 

 

4. Fragment와 소통할 Adapter를 만든다. 

- inner class (내부 클래스) 이다. 

- FragmentStateAdapter 를 상속한다. 

    private inner class ViewPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) 
    	: FragmentStateAdapter(fragmentManager, lifecycle)  {
        
        override fun getItemCount(): Int  = 4  //menu의 갯수

        override fun createFragment(position: Int): Fragment {
            return when (position) {
                0 -> 사용할 프래그먼트1()
                1 -> 사용할 프래그먼트2()
                2 -> 사용할 프래그먼트3()
                3 -> 사용할 프래그먼트4()
                else -> error("No Fragment")
            }
        } //createFragment
        
    } // ViewPagerAdapter

 

5. ViewPager2의 변화를 인지하는 콜백메서드를 작성한다. 

- bottom메뉴의 선택이 일어났을때, 자동으로 화면이 이동하게 해준다. 

    private inner class ViewPagerPageChangeCallback: ViewPager2.OnPageChangeCallback() {
    
        override fun onPageSelected(position: Int) {
            binding.bottomNavigationView.selectedItemId = when(position){
            
                0 -> R.id.menu1
                1 -> R.id.menu2
                2 -> R.id.menu3
                3 -> R.id.menu4
                else -> error("no menu.")
                
            }
        }
    }

 

6. BottonNavigation의 선택된 메뉴의 리스너를 설정해준다. 

    override fun onNavigationItemSelected(item: MenuItem): Boolean {

        when(item.itemId){
            R.id.menu1 -> {
                binding.보여질화면ID.currentItem = 0
                return true
            }
            R.id.menu2 -> {
                binding.보여질화면ID.currentItem = 1
                return true
            }
            R.id.menu3 -> {
                binding.보여질화면ID.currentItem = 2
                return true
            }
            R.id.menu4 -> {                
                binding.보여질화면ID.currentItem = 3
                return true
            }
        }
        return false
        
    } // onNavigationItemSeleceted

 

이렇게 하면 화면이 이동하고 좋지만, 

너무 민감하게 반응해서 

간단한 리스트화면이나 카카오톡 같은 화면들의 이동시 사용하면 좋겠다. 

민감도를 낮추는 방법도 있는 듯하다. 

개인적으로는 사용해봤지만, 비추다. 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Programming > Android' 카테고리의 다른 글

안드로이드 버전 정보  (0) 2021.07.08
Dagger 대거 (의존성 주입)  (0) 2021.05.11
[Ad] 광고 도구  (0) 2020.12.25
    'Programming/Android' 카테고리의 다른 글
    • All Of Android Setting
    • 안드로이드 버전 정보
    • Dagger 대거 (의존성 주입)
    • [Ad] 광고 도구
    greenhelix
    greenhelix
    개발에 관한 것들과 개인적인 것을 담는 블로그

    티스토리툴바