본문 바로가기
ANDROID/Android 개발 이슈 & 해결

[Android] setOnNavigationItemSelectedListener deprecated 해결

by 주 녕 2021. 8. 3.
반응형

인스타그램 클론 코딩을 하는 도중, BottomNavigation을 만들면서 만난 issue입니다.

BottomNavigation의 리스너인 setOnNavigationItemSelectedListener를 이용하여 select 이벤트를 완성하려고 했는데, 이번에 업데이트를 하면서 deprecated 된 것을 발견했습니다.

 

BottomNavigationView.OnNavigationItemSelectedListener  |  Android 개발자

BottomNavigationView.OnNavigationItemSelectedListener public static interface BottomNavigationView.OnNavigationItemSelectedListener implements NavigationBarView.OnItemSelectedListener com.google.android.material.bottomnavigation.BottomNavigationView.OnNavi

developer.android.com

 

그리고 깃허브의 material-compoents/material-components-android 의 소스를 보면 아래와 같이 명시되어 있습니다.

그리고 NavigationBarView.setOnItemSelectedListener를 대신 사용하라고 되어있죠?

또한 깃허브에서도 왜 deprecated 되었는지 알 수 없었습니다... 😓😕

https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/bottomnavigation/BottomNavigationView.java#L223

 

🤷‍♀️ 그렇다면 NavigationBarView는 무엇일까..?

우선 공식 문서의 BottomNavigationView를 살펴보면

BottomNavigationView는 NavigationBarView를 extends 했다고 명시되어 있습니다. NavigationBarView는 BottomNavigation이나 Navigation Rail 구현에 사용할 수 있는 네비게이션 바의 추상적인 구현을 제공한다고 공식 문서가 설명하고 있습니다.

즉, 우리는 NavigationBarView의 리스너 인터페이스를 직접 사용하는 방법으로 대체하는 것입니다.

하지만 왜 deprecated를 해놓고 공식 문서에는 아무 설명을 해놓지 않았는지 의문입니다.. 아니면 제가 못찾은걸까요?

 

🚩 NavigationBar 구현 방법_Kotlin

사용 방법은 setOnNavigationItemSelectedListener과 같고

setOnItemSelectedListener로 메서드명만 대체하여 사용하면 된다! 해결 방법은 쉬웠습니다 🤔🧐

binding은 viewBinding을 사용했으므로...!

fun initNavigationBar() {
        binding.navigationBar.run { 
            // ↓ 아래 메소드만 변경하여 해결
            setOnItemSelectedListener { item ->
                when(item.itemId) {
                    R.id.action_home -> {
                        changeFragment(HomeFragment())
                    }
                    ...
                }
                true
            }
            selectedItemId = R.id.action_home  // 초기값 세팅
        }
    }

 

 


reference >

 

반응형

댓글