관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] Jetpack Navigation Fragment 전환시 BottomNavigationView 숨기는 방법 본문

안드로이드/코틀린 & 아키텍처 & Recent

[안드로이드] Jetpack Navigation Fragment 전환시 BottomNavigationView 숨기는 방법

막무가내막내 2020. 6. 27. 00:58
728x90

 

[2021-04-13 업데이트]

 

Jetpack 바텀네비게이션 뷰를 프래그먼트 아이디를 통해 Visbility를 컨트롤할 수 있는 방법에 대해 포스팅하려고 합니다.  ㅎㅎ

 

보통 앱은 기본적으로 하나의 액티비티 안에 바텀네비게이션과 그 바텀 버튼에 해당하는 프래그먼트로 이루어져 있는 경우가 많습니다.

 

그리고 이 네비게이션에 해당하는 프래그먼트들에서 상세화면으로 가는 버튼을 누른다고 가정하면 Jetpack Navigation 기능을 사용해 다른 프래그먼트으로 이동할 수 도 있습니다.

 

이때 바텀네비게이션과 종속되어 있는 메인화면이 아닌 상세화면에서 프래그먼트는 바텀 네비게이션이 불필요할겁니다.

 

이것을 컨트롤하기위한 방법을 Jetpack Navigation 다음 문서에서 확인할 수 있었습니다.

 

 

https://developer.android.com/guide/navigation/navigation-ui

 

NavigationUI로 UI 구성요소 업데이트  |  Android 개발자  |  Android Developers

탐색 아키텍처 구성요소에는 NavigationUI 클래스가 포함되어 있습니다. 이 클래스에는 상단 앱 바, 탐색 창, 하단 탐색으로 탐색을 관리하는 정적 메서드가 있습니다. 탐색 이벤트 수신 대기 NavContr

developer.android.com

 

 

 

 

이 문서를 참고하여 다음과 같이 OnDestinationChangedListener 를 통해 구현할 수 있었습니다. 

바텀네비게이션에 해당하는 프래그먼트 아이디냐에 따라 바텀네비뷰를 조정했습니다.

class MainActivity : BaseActivity<ActivityMainBinding>(R.layout.activity_main) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initNavigation()
        getHashKey()
//        val tmapview = TMapView(this)
//        tmapview.setSKTMapApiKey(getString(R.string.tmap_key))
//
//        val linearLayoutTmap = findViewById<LinearLayout>(R.id.linearLayoutTmap)
//        val tMapView = TMapView(this)
//
//        tMapView.setSKTMapApiKey(getString(R.string.tmap_key))
//        linearLayoutTmap.addView(tMapView)
    }

    private fun initNavigation() {
        val navController = findNavController(R.id.main_nav_host)
        binding.mainBottomNavigation.setupWithNavController(navController)
        binding.mainBottomNavigation.itemIconTintList = null

        navController.addOnDestinationChangedListener { _, destination, _ ->
            if (destination.id == R.id.bottom_nav_1 || destination.id == R.id.bottom_nav_2 || destination.id == R.id.bottom_nav_3 || destination.id == R.id.bottom_nav_4) {
                binding.mainBottomNavigation.visibility = View.VISIBLE
            } else {
                binding.mainBottomNavigation.visibility = View.GONE
            }
        }
    }
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".views.MainActivity">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/main_fcv_container"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintBottom_toTopOf="@id/main_bottom_navigation"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintEnd_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <fragment
                android:id="@+id/main_nav_host"
                android:name="androidx.navigation.fragment.NavHostFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:defaultNavHost="true"
                app:navGraph="@navigation/bottom_nav_graph" />
        </androidx.fragment.app.FragmentContainerView>


        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/main_bottom_navigation"
            android:layout_width="match_parent"
            android:layout_height="54dp"
            android:background="@color/colorWhite"
            android:paddingStart="18dp"
            android:paddingLeft="18dp"
            android:paddingEnd="18dp"
            android:paddingRight="18dp"
            app:itemIconSize="48dp"
            app:labelVisibilityMode="unlabeled"
            app:layout_behavior="tech.thdev.app.view.BottomNavigationBehavior"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/main_fcv_container"
            app:menu="@menu/bottom_menu" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

처음에 이동시 바텀네비뷰를 직접 바꿔줘야하나 했는데 문서에서 Jetpack Navigation 에서 제공하는 방법이 있더라고요 ㅎㅎ 

 

 

댓글과 공감은 큰 힘이 됩니다.

 

감사합니다.

728x90
Comments