build.gradle 파일의
dependencies 중괄호 안에
implementation 'com.google.android.material:material:1.5.0'
을 추가해준다.
그리고 상단의 Sync Now를 클릭해서 싱크 작업을 진행해 준다.(사진은 이미 클릭해서 진행중인 것)
그리고 app/src/main/res 에 새로운 폴더를 하나 만들어준다. Resource 타입은 menu를 선택해준다.
추가된 menu 폴더에 New - Menu Resource File 을 클릭해준다
파일명은 navi_menu.xml 으로 해주자
그리고 navigation View에 사용할 이미지들을 안드로이드에서 기본적으로 제공하는 걸 활용하기 위해 추가해준다.
빨간 네모를 클릭해서 들어가면 여러가지 이미지를 볼 수 있는데 이 중 마음에 드는 것을 선택하고
Ok- Next - Finish 하면 drawable 폴더에 추가가 된 것을 확인 할 수 있다.
방금 전 생성한 menu 파일에 아래와 같이
navi_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item android:id="@+id/access"
android:icon="@drawable/ic_baseline_accessibility_24"
android:title="접근성"/>
<item android:id="@+id/email"
android:icon="@drawable/ic_baseline_email_24"
android:title="이메일"/>
<item android:id="@+id/message"
android:icon="@drawable/ic_baseline_send_24"
android:title="메시지"/>
</group>
</menu>
위와 아래 같은 코드를 입력해준다. 이 group이
Navigation VIew를 만들어 줄 Activity의 xml 레이아웃에 가서 xmls 앞을 지우고 Dra 만 입력해서 첫번째 자동완성을 입력해 준다.
NaviActivity.kt (액티비티 파일)
activity_navi.xml (레이아웃 파일)
Componet Tree 탭 창에 ConstraintLayout 을 DrawerLayout 밑에 드래그 해와서 추가해준다.
네비게이션 뷰를 클릭을 했을때 버튼이 튀어나오게끔 새로운 Vector Asset 을 추가해준다.
햄버거 아이콘을 가져와 ImageView로 추가해 주었다.
그리고 ConstratintLayout 태그의 바깥쪽에 navi 를 입력하여 자동완성된 navigation 태그를 입력한다.
layout_width = wrap_content / layout_height = match_parent 를 해준다. 그리고 아까 메뉴폴더에다가 만들어준 Menu Resource File 인 navi_menu 를 가져와 준다.
그렇게 되면 이전의 메뉴 (버거 아이콘, 세줄 짜리)가 안보이고 navi_menu 가 출력됨을 볼 수 있다.
그래서 layout_gravity 값을 start로 주면 원하던 대로 출력됨을 볼 수 있다.
아이디 값 까지 추가해주었다.
전체코드 : activity_navi.xml (빈프로젝트에서 생성했으면 activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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"
android:id="@+id/layout_drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".NaviActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/btn_navi"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="8dp"
android:layout_marginTop="4dp"
android:src="@drawable/ic_baseline_menu_64"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/naviView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/navi_menu"/>
</androidx.drawerlayout.widget.DrawerLayout>
이제 NaviActivity로 가서 코드를 작성하면 된다.
네비게이션 뷰를 출력해줄 Activity에 가서 AppCompatAcitivtu() 외에도 NavigationView.OnNavigationItemSelectedListener를 추가해주자.
빨간줄로 오류메시지가 뜨는데 Alt + Enter 로 Implement members를 클릭하자
OK
그러면 이렇게 onNavigationItemSelected 함수를 오버라이드 할 수 있게 된다.
이 아이템은 주석처럼 네비게이션 아이템 클릭시 수항하는 함수이다.
override fun onNavigationItemSelected(item: MenuItem): Boolean { //네비게이션 아이템 클릭시 수행하는 녀석
when (item.itemId) {
R.id.access -> Toast.makeText(applicationContext, "접근성", Toast.LENGTH_SHORT).show()
R.id.email -> Toast.makeText(applicationContext, "이메일", Toast.LENGTH_SHORT).show()
R.id.message -> Toast.makeText(applicationContext, "메시지", Toast.LENGTH_SHORT).show()
}
binding.layoutDrawer.closeDrawers() //네비게이션 뷰 닫기
return false
}
이렇게 하고 끝이면 좋겠지만 뒤로가기 버튼 클릭시 전체 어플리케이션이 종료가 되는 문제가 있다.
그래서
Ctrl + O : 추천 오버라이드 메소드
네비게이션 뷰가 켜진 상태에서 백버튼을 눌러도 어플이 종료되지 않고 네비게이션 뷰가 닫힌다.
NaviActivity.kt
package com.example.myapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.MenuItem
import android.widget.Toast
import androidx.core.view.GravityCompat
import com.example.myapplication.databinding.ActivityMainBinding
import com.example.myapplication.databinding.ActivityNaviBinding
import com.google.android.material.navigation.NavigationView
class NaviActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
private lateinit var binding: ActivityNaviBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityNaviBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
binding.btnNavi.setOnClickListener {
binding.layoutDrawer.openDrawer(GravityCompat.START) //LEFT 와 같은 말. END : RIGHT
}
binding.naviView.setNavigationItemSelectedListener(this) //네비게이션 메뉴 아이템에 클릭 속성을 부여하는 것.
}
override fun onNavigationItemSelected(item: MenuItem): Boolean { //네비게이션 아이템 클릭시 수행하는 녀석
when (item.itemId) {
R.id.access -> Toast.makeText(applicationContext, "접근성", Toast.LENGTH_SHORT).show()
R.id.email -> Toast.makeText(applicationContext, "이메일", Toast.LENGTH_SHORT).show()
R.id.message -> Toast.makeText(applicationContext, "메시지", Toast.LENGTH_SHORT).show()
}
binding.layoutDrawer.closeDrawers() //네비게이션 뷰 닫기
return false
}
override fun onBackPressed() { //백버튼 눌렀을때 수행하는 메소드
if (binding.layoutDrawer.isDrawerOpen(GravityCompat.START)) {
binding.layoutDrawer.closeDrawers()
} else {
super.onBackPressed() //일반 백버튼 실행 (finish)
}
}
}
https://www.youtube.com/watch?v=ALTFLXKiPUY
'Android(Kotlin)' 카테고리의 다른 글
[Android] build.gradle 이란? (0) | 2022.02.24 |
---|---|
[Android] Shared Preferences DB없이 간단한 문자열 값 앱 내부에 저장하기 (토글 스위치 등등) (0) | 2022.02.24 |
[Android] 에뮬레이터 위의 보라색 바 제거하기 변경하기 (0) | 2022.02.24 |
[Android] 첫 화면 설정 (0) | 2022.02.24 |
[Kotlin][Android] 리스트뷰 커스텀 어뎁터 사용하는 법(ListView Custom Adapter ) (0) | 2022.02.23 |