코틀린 안드로이드 앱개발 강좌, 내비게이션 뷰 – 드로어 화면 구성

안드로이드는 멀티페이지 애플리케이션을 만들 때 화면 간 전환을 관리하기 위한 여러 가지 방법을 제공합니다. 그 중에서도 인기 있는 방법 중 하나가 바로 내비게이션 뷰(Navigation Drawer)입니다. 이 글에서는 내비게이션 뷰를 통해 드로어 화면을 구성하는 방법에 대해 상세히 알아보겠습니다.

1. 내비게이션 뷰란?

내비게이션 뷰는 사용자가 다양한 앱의 섹션으로 손쉽게 이동할 수 있도록 돕는 UI 컴포넌트입니다. 일반적으로 화면의 왼쪽에서 슬라이드하여 표시되며, 기본적으로 사용자가 상단에 있는 햄버거 아이콘을 클릭하거나 스와이프하여 열 수 있습니다.

2. 내비게이션 뷰의 장점

  • 직관적인 탐색: 사용자가 선택 가능한 여러 섹션을 일목요연하게 보여주어 탐색이 용이합니다.
  • 화면 공간 절약: 기본적으로 숨겨져 있다가 필요할 때만 나타나므로 화면 활용도가 높습니다.
  • 일관된 UI 제공: 다양한 화면 구성에서도 일관된 사용자 경험을 제공합니다.

3. 내비게이션 뷰 구성하기

Step 1: 프로젝트 설정

안드로이드 스튜디오를 열고 새로운 프로젝트를 생성합니다. “Empty Activity”를 선택하여 기본 구조로 시작합니다. Kotlin을 언어로 선택하고, 패키지 이름 및 저장 경로를 설정한 후 “Finish”를 클릭하여 프로젝트를 생성합니다.

Step 2: Gradle Dependencies 설정

내비게이션 뷰를 사용하기 위해 필요한 종속성을 추가합니다. 프로젝트의 build.gradle 파일을 열고 다음 라이브러리를 추가합니다:

    
    dependencies {
        implementation 'com.google.android.material:material:1.5.0'
    }
    
    

위의 라이브러리는 Material Design 컴포넌트들을 지원합니다. 이후 Gradle Sync를 통해 변경 사항을 적용하세요.

Step 3: XML 레이아웃 만들기

메인 액티비티의 레이아웃 파일인 activity_main.xml을 수정하여 내비게이션 뷰를 추가합니다. 다음은 기본 구조의 예시입니다:

    
    <androidx.drawerlayout.widget.DrawerLayout
        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/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="메인 컨텐츠"
                android:layout_gravity="center"/>

        </FrameLayout>

        <com.google.android.material.navigation.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:headerLayout="@layout/nav_header"
            app:menu="@menu/nav_menu"/>

    </androidx.drawerlayout.widget.DrawerLayout>
    
    

Step 4: 내비게이션 메뉴 생성

내비게이션 뷰에 필요한 메뉴 항목을 설정합니다. res/menu/nav_menu.xml 파일을 생성하고 다음 내용을 추가합니다:

    
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:id="@+id/nav_home"
            android:title="홈"/>
        <item
            android:id="@+id/nav_profile"
            android:title="프로필"/>
        <item
            android:id="@+id/nav_settings"
            android:title="설정"/>
    </menu>
    
    

Step 5: 내비게이션 뷰와 액티비티 연결하기

내비게이션 뷰와 메인 액티비티를 연결하기 위해 MainActivity.kt 파일을 수정합니다. 다음은 기본적인 코드를 포함한 예시입니다:

    
    package com.example.navigationdrawer

    import android.os.Bundle
    import androidx.appcompat.app.AppCompatActivity
    import androidx.drawerlayout.widget.DrawerLayout
    import com.google.android.material.navigation.NavigationView
    import androidx.appcompat.widget.Toolbar
    import android.view.MenuItem
    import android.content.Intent

    class MainActivity : AppCompatActivity() {

        private lateinit var drawerLayout: DrawerLayout
        private lateinit var navView: NavigationView

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            val toolbar: Toolbar = findViewById(R.id.toolbar)
            setSupportActionBar(toolbar)

            drawerLayout = findViewById(R.id.drawer_layout)
            navView = findViewById(R.id.nav_view)

            navView.setNavigationItemSelectedListener { menuItem ->
                when (menuItem.itemId) {
                    R.id.nav_home -> {
                        // 홈 클릭 시 처리할 내용
                        true
                    }
                    R.id.nav_profile -> {
                        // 프로필 클릭 시 처리할 내용
                        true
                    }
                    R.id.nav_settings -> {
                        // 설정 클릭 시 처리할 내용
                        true
                    }
                    else -> false
                }.also {
                    drawerLayout.closeDrawers() // 드로어를 닫음
                }
            }
        }
    }
    
    

Step 6: 드로어 열기 및 닫기

드로어를 열거나 닫으려면 사용자 인터페이스 요소를 사용해야 합니다. 일반적으로 Toolbar의 햄버거 아이콘을 클릭하여 드로어를 여는 구조로 설정합니다. 다음 코드를 MainActivity.kt에 추가합니다:

    
    toolbar.setNavigationOnClickListener {
        drawerLayout.openDrawer(GravityCompat.START)
    }
    
    

위의 코드는 드로어 레이아웃의 내비게이션 아이콘(햄버거 아이콘)을 클릭했을 때 드로어를 엽니다.

4. 다중 Fragment 관리

내비게이션 뷰와 함께 다중 Fragment를 관리하기 위해 Fragment를 추가하는 방법도 알아보겠습니다. Fragment는 UI를 구성하는 독립적인 모듈로, 여러 화면 구성에서 반복해서 사용할 수 있습니다.

Step 1: Fragment 클래스 생성

먼저, Fragment 클래스를 생성합니다. 예를 들어 “HomeFragment”, “ProfileFragment”, “SettingsFragment”를 만들어보겠습니다:

    
    class HomeFragment : Fragment() {
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            return inflater.inflate(R.layout.fragment_home, container, false)
        }
    }

    class ProfileFragment : Fragment() {
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            return inflater.inflate(R.layout.fragment_profile, container, false)
        }
    }

    class SettingsFragment : Fragment() {
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            return inflater.inflate(R.layout.fragment_settings, container, false)
        }
    }
    
    

Step 2: Fragment 레이아웃 파일 생성

각 Fragment에 대한 레이아웃 파일을 생성해야 합니다. 아래는 각 Fragment에 대한 XML 레이아웃 파일의 예시입니다:

    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="홈 화면"/>
    </LinearLayout>

    <!-- profile.xml -->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="프로필 화면"/>
    </LinearLayout>

    <!-- settings.xml -->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="설정 화면"/>
    </LinearLayout>
    
    

Step 3: Fragment 전환 처리

메뉴 항목 클릭 시 해당 Fragment로 전환하는 코드를 작성합니다. MainActivity.ktnavView.setNavigationItemSelectedListener 부분을 수정합니다:

    
    navView.setNavigationItemSelectedListener { menuItem ->
        val fragment: Fragment = when (menuItem.itemId) {
            R.id.nav_home -> HomeFragment()
            R.id.nav_profile -> ProfileFragment()
            R.id.nav_settings -> SettingsFragment()
            else -> HomeFragment()
        }
        supportFragmentManager.beginTransaction()
            .replace(R.id.content_frame, fragment)
            .commit()
        drawerLayout.closeDrawer(GravityCompat.START)
        true
    }
    
    

5. 내비게이션 뷰 최적화하기

앱의 성능을 최적화하기 위해 여러 가지 방법을 적용할 수 있습니다. 예를 들어, 비동기 작업이나 데이터 캐싱 기법을 사용하여 UI를 보다 부드럽게 만들 수 있습니다.

결론

이제 Kotlin을 이용해 안드로이드 앱 개발에서 내비게이션 뷰를 사용하여 뛰어난 사용자 경험을 제공할 수 있는 방법에 대해 알게 되었습니다. 내비게이션 뷰는 현대 안드로이드 앱에서 필수적인 요소 중 하나이며, 다양한 사용자 인터페이스를 구현하는 데 매우 유용합니다. 앞으로의 개발 과정에도 내비게이션 뷰를 적극 활용해 보시기 바랍니다!

참고 자료