본문 바로가기
개발

TIL : BottomNavigationView 구현

by kks950115 2024. 1. 12.
728x90

바텀 네비게이션을 뷰라는 하단메뉴가 이미 있다고 한다. 미리 구현되어 있는 게 참 많은 거 같다.

 

우선 메뉴를 구현해주자

 

res/menu/bottom_menu.xml을 만들어주었다.

경로를 꼭 지켜줘야한다. 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/navi_home"
        android:icon="@drawable/hut"
        android:enabled="true"
        app:showAsAction="ifRoom"
        android:title="홈"/>
    <item
        android:id="@+id/navi_localLife"
        android:icon="@drawable/copy"
        android:enabled="true"
        app:showAsAction="ifRoom"
        android:title="동네생활"/>
    <item
        android:id="@+id/navi_myrear"
        android:icon="@drawable/location"
        android:enabled="true"
        app:showAsAction="ifRoom"
        android:title="내 근처"/>
    <item
        android:id="@+id/navi_chat"
        android:icon="@drawable/chat"
        android:enabled="true"
        app:showAsAction="ifRoom"
        android:title="채팅"/>
    <item
        android:id="@+id/navi_myInfo"
        android:icon="@drawable/user2"
        android:enabled="true"
        app:showAsAction="ifRoom"
        android:title="나의 정보" />

</menu>

메뉴를 클릭하면 글자색과 아이콘 색이 바뀌게 하고 싶어서 스타일도 만들어주었다.

해당 파일은 res/color/bottom_menu_style.xml이다. 뒤에 파일이름은 맘대로 적어도 상관없지만 res/color는 반드시 지켜줘야한다.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true"
        android:color="#ff8418"/>
    <item android:color="#ffffff"/>
</selector>

 

적용될 화면에다가 배치할 차례다. 

res/layout/activity_home.xml이라 만들고 배치하였다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

	//여기다가 프래그먼트도 구현할거다.
    <FrameLayout
        android:id="@+id/homeFragmentContainer"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/bottom_navi_viiew"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0" /> 

	//바텀네비게이션뷰
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navi_viiew"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="5dp"
        android:background="#222222"
        app:itemIconTint="@color/bottom_menu_style" //아이콘색 바뀌게 하는 bottom_menu_style을 여기다가 적어준다.
        app:itemTextColor="@color/bottom_menu_style" //글자색 바뀌게 하는 bottom_menu_style을 여기다가 적어준다.
        app:labelVisibilityMode="labeled" // 이 값으로 해놓으면 글자와 아이콘이 동시에 나온다.
        app:menu="@menu/bottom_menu" // res/menu에 있던 파일을 적용해준다.
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

com.google.android.material.bottomnavigation.BottomNavigationView  <- 이 한덩어리면 끝이다.

 

시각적으로 보이는 것들을 만들었으니 이제 작동이 되게 할 차례다.

class HomeActivity : AppCompatActivity() {
    private val binding by lazy { ActivityHomeBinding.inflate(layoutInflater) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

		//네비게이션뷰 코드
        binding.bottomNaviViiew.run{ //setonnavigationitemselectedlistener 라는 것이 있지만 Deprecated 되었으므로 대체했다.
            setOnItemSelectedListener {
                when(it.itemId) {
                    R.id.navi_home -> {   //res/menu에 있던 아이디들을 적는다. 
                        val intent = Intent(applicationContext,HomeActivity::class.java)
                        startActivity(intent)
                    }
                    R.id.navi_localLife -> {
                        val intent = Intent(applicationContext,LocalLifeActivity::class.java)
                        startActivity(intent)
                    }
                    R.id.navi_myInfo -> {
                        val intent = Intent(applicationContext,MyinfoActivity::class.java)
                        startActivity(intent)
                    }
                    R.id.navi_chat -> {
                        val intent = Intent(applicationContext,ChatActivity::class.java)
                        startActivity(intent)
                    }
                }
                true //트루로 해놓아야 작동이 된다고 한다. 
            }
        }
    }

}

 

현재는 명시적 인텐트로 페이지를 이동하지만 프래그먼트로 대체할 계획이다.

 

근데 문제가 생겼다....

위에 게시글은 임의로 채워넣은거다. 하단 메뉴만 주목하길 바란다.

내 의도는 하단에 메뉴를 클릭했을 때 주황색으로만 변하는건데 아이콘 주변에 분홍색 배경이 생긴다. 메테리얼 테마가 적용된거같은데.... 해결하면 추후 수정하겠다.

728x90
반응형

댓글