[안드로이드스튜디오-Kotlin]

[안드로이드 스튜디오] Navigation View

김채연채연 2022. 10. 3. 16:18

오늘도 역시 동일하게 새로운 파일(이름은 navigationKt) 을 만든다.

그리고 Gradle 의 build.gradle 에 들어가면 아래 dependencies 가 있다. 이게 뭐냐면 '의존성' 을 하나씩 추가하는거다.

사용자들이 만든 라이브러리를 하나씩 추가하는것이다.

우리는 네비게이션 뷰를 사용하기 이해 하나를 import 해준다.

implementation 'com.google.android.material:material:1.6.1'

이제 네비게이션 뷰를 사용할 준비는 끝났다.

다음은 네비게이션 뷰 전용의 폴더를 만든다. (res->new->android resource directory)

메뉴로 설정한다. 그럼 빈 폴더가 생성되고, 또 그 폴더에 new->menu resource file 이름은 navi_meu 이다.

그럼 이렇게 창이 뜬다 !

split 창에서 코딩을 시작한다.

flaticon에서 이미지를 가져온적이있지만 이 안에서도 가져올 수 있다.

drawable->new->vector asset

이메일,접근성,메세지 모양의 이미지를 가져온다.

<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>

각각 아이디와 아이콘 그리고 타이틀을 지정해주면 된다.

다음은 액티비티 메인으로 이동한다.

네비게이션 뷰를 사용하려면 최상단의 ConstraintLayout 까지 삭제해준다.

그리고 Dra 입력 후 자동완성을 입력한다. (텍스트뷰가 위로 올라옴)

디자인창에서 팔레트의 Layout->Constraint... 를 DrawerLayout 아래에 넣어준 후 TextView를 Constraint... 아래에 넣어준다.

그럼 올라갔던 텍스트뷰가 원상복구된다.

layout_drawer 의 아이디는 layout_drawer 로 설정한다.

메뉴를 누르면 네비게이션뷰가 나오게 할 것 이므로 vector asset에서 메뉴 아이콘도 추가한다.

이제 팔레트의 imagerView 를 활용해 메뉴 아이콘을 넣어준다.(크기는 50dp)

다음 split 창으로 간다.

<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=".MainActivity">


    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:id="@+id/btn_navi"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:srcCompat="@drawable/ic_baseline_menu_64" />
    </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>

이제 메뉴 버튼을 누르면 오른쪽으로 슬라이드 되는 작업을 시작한다.

메인액티비티로 넘어간다.

package com.example.navigationkt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Gravity
import android.view.MenuItem
import android.widget.Toast
import androidx.core.view.GravityCompat
import com.google.android.material.navigation.NavigationView
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.coroutines.NonCancellable.start

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener{
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btn_navi.setOnClickListener{
            layout_drawer.openDrawer(GravityCompat.START) //start는 left , end 는 right (방향을 가르킨다.)
        }

        naviView.setNavigationItemSelectedListener(this) // 네비게이션 메뉴 아이템에 클릭 속성 부여
    }

    override fun onNavigationItemSelected(item: MenuItem): Boolean { // 네비게이션 메뉴 아이템 클릭 시 수행
    when (item.itemId) //navi_menu 에 있는것들을 가져올 수 있음
    {
        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()
    }
        layout_drawer.closeDrawers() //네비게이션 뷰 닫기
        return false
    }
}

NavigationView.OnNavigationItemSelectedListener클릭했을때 네비게이션 아이템들을 선택할 수 있게 상속

오류가 뜨는 부분을 클리하고 리스너를 추가한다.

우리가 아까 선언했던 메뉴에 기능부여를 하지 않았다. (btn_navi)

눌렀을때 옆에 밀려있는게 보이게끔 해야한다.

toast 메세지를 띄워주고, 네비게이션 뷰 닫기 기능도 넣어준다.

layout_drawer.openDrawer(GravityCompat.START) : 어떤 방향으로 열지 지정한다.

naviView.setNavigationItemSelectedListener(this):매우 결정적이다. 이게 없으면 아래 작성한 것들이 모두 소용없어진다.

이렇게 메뉴창을 열면 입력한 메뉴가 열린다.

그런데 뒤로가기를 누르면 메뉴를 닫아줘야하는데 앱이 닫아진다. 해결하려면

ctrl + o

그리고onbackpressed() 를 추가한다.

override fun onBackPressed() {
        if (layout_drawer.isDrawerOpen(GravityCompat.START)) {
            layout_drawer.closeDrawers()
        } else {
            super.onBackPressed() // 일반 백버튼 기능 실행
        }
    }

이렇게 하면 뒤로가기를 누르면 메뉴가 꺼지는 액션까지 완성된다.

추가로 위의 보라색 바 (액션바) 를 바꾸고싶다면 app -> manifests 에 간 후 theme 에서 NoActionbar 하면 된다.

어렵다 어려워,,,^^