BottomNavigationView 중복 클릭 막아주기

이지훈·2022년 3월 1일
0

지금까지 BottomNavigationView를 이용해서 만든 앱의 단점은 다음과 같았다.

  1. BottomNavigationView의 아이템을 눌렀을때 화면이 전환된다.
  2. 다시 그 아이템을 눌르면 해당 화면(프래그먼트)가 재 호출된다.
  3. 이를 빠르게 반복할 경우 화면이 깜빡거리는 현상이 발생한다. (UI 구림..)
    (데이터를 서버에서 가져오고 다 가져오면 화면에 뿌리는 데 까지의 딜레이)
  4. 쓸데없는 서버의 데이터 반복 호출은 덤..

어떻게 이 문제를 해결하지... 현재는 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
왕초보 안드로이드 개발 질문방

profile
실력은 고통의 총합이다. Android Developer

0개의 댓글