지금까지 BottomNavigationView를 이용해서 만든 앱의 단점은 다음과 같았다.
어떻게 이 문제를 해결하지... 현재는 Fragment를 create & remove방식을 사용중이었는데 show & hide 방식으로 바꿔줘야하나..? 그러면 데이터 변화 감지를 잘해줘야하는데...
하면서 고민을 했었는데 간단한 해결법이 있었다.
이를 해결한 코드는 다음과 같다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityHomeBinding.inflate(layoutInflater)
setContentView(binding.root)
accessToken = preferenceManager.getAccessToken()
refreshToken = preferenceManager.getRefreshToken()
supportFragmentManager.fragmentFactory = SlothFragmentFactory()
initNavigationEvent()
if (::fcmToken.isInitialized.not()) {
registerFCMToken()
}
}
private fun initNavigationEvent() = with(binding) {
navigationView.setOnItemSelectedListener { menuItem ->
when (menuItem.itemId) {
R.id.menu_today -> changeFragment(TodayFragment::class.java.name)
R.id.menu_class -> changeFragment(ListFragment::class.java.name)
R.id.menu_mypage -> changeFragment(ManageFragment::class.java.name)
}
true
}
navigationView.selectedItemId = R.id.menu_today
navigationView.setOnItemReselectedListener { menuItem ->
when (menuItem.itemId) {
R.id.menu_today -> {}
R.id.menu_class -> {}
R.id.menu_mypage -> {}
}
}
}
private fun changeFragment(className: String) {
val fragment = supportFragmentManager.fragmentFactory.instantiate(classLoader, className)
supportFragmentManager.beginTransaction().replace(R.id.container, fragment).commit()
}
BottomNavigationView의 내장된 함수인 setOnItemReselectedListener를 이용해서
기존의 선택된 버튼이 재 호출시 아무 이벤트도 일어나지 않게하여 버튼이 눌리는것이 막아지는 역할을 수행하도록 하였다.
당근 마켓같은 경우도 코드는 모르지만 다음과 같이 한번 더 버튼을 누르면 아무런 응답이 없게 해놓은 것을 확인 할 수 있었다.
다음으로 BottomNavigationItem을 선택할때 애니메이션을 없애는 방법이다.
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigation_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_home_menu_rounded"
android:elevation="20dp"
app:itemBackground="@color/white"
app:itemTextColor="@drawable/selector_menu_bottom_text"
app:layout_constraintBottom_toBottomOf="parent"
app:menu="@menu/bottom_navigation_menu" />
버튼을 눌러도 아무런 이벤트가 일어나지않는데 애니메이션은 발생하니 아예
ItemBackgroundColor를 white로 설정해 애니메이션이 일어나지 않도록 바꿔주었다.
사실 애니메이션이 필요없기도 했어서...
오랫동안 해결하지못한 문제를 간단한 방법으로 해결해서 기분이좋다. 역시 사람은 혼자 끙끙 앓고 있지말고 도움을 구해야한다. 안린이들은 오카방을 적극적으로 이용하도록 하자.
reference)
https://nuritech.tistory.com/13
왕초보 안드로이드 개발 질문방