Android 앱을 개발하다 보면 화면 하단의 내비게이션 바(Navigation Bar)의 높이나 너비를 알아야 하는 경우가 종종 있습니다. 콘텐츠가 내비게이션 바에 가려지지 않도록 레이아웃 여백을 계산하거나, 몰입형(전체 화면) 모드에서 UI 요소의 위치를 조정할 때 특히 유용합니다. 이 글에서는 Kotlin을 사용해 내비게이션 바의 크기를 프로그래밍 방식으로 구하는 방법을 단계별로 살펴봅니다.
핵심 원리: 시스템 dimen 리소스 활용
Android는 내비게이션 바의 높이를 navigation_bar_height라는 이름의 시스템 차원(dimen) 리소스로 제공합니다. Resources.getIdentifier()로 해당 리소스 ID를 찾은 후 getDimensionPixelSize()를 호출하면, 기기별로 다른 실제 픽셀(px) 값의 높이를 얻을 수 있습니다.
1단계 — 새 프로젝트 생성
Android Studio에서 File ⇒ New Project를 선택하고, 필요한 정보를 모두 입력하여 새 프로젝트를 만듭니다.
2단계 — 레이아웃 작성
res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="70dp"
android:background="#008080"
android:padding="5dp"
android:text="TutorialsPoint"
android:textColor="#fff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Android Navigation Bar Height and Width"
android:textColor="@android:color/holo_purple"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/text"
android:layout_centerInParent="true"
android:layout_marginTop="10dp"
android:textColor="@android:color/background_dark"
android:textSize="24sp"
android:textStyle="bold" />
</RelativeLayout>
3단계 — MainActivity.kt 작성
src/MainActivity.kt 파일에 아래 코드를 추가합니다.
import android.content.res.Resources
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
val textView: TextView = findViewById(R.id.textView)
val resources: Resources = applicationContext.resources
// 시스템 리소스에서 navigation_bar_height의 리소스 ID를 조회합니다.
val resourceId: Int =
resources.getIdentifier("navigation_bar_height", "dimen", "android")
if (resourceId > 0) {
// 리소스 ID를 실제 픽셀(px) 값으로 변환합니다.
val navBarHeightPx: Int = resources.getDimensionPixelSize(resourceId)
textView.text = "내비게이션 바 높이: ${navBarHeightPx}px"
}
}
}
참고로, 단순히 setText(resourceId)를 호출하면 화면에 리소스 ID 숫자만 표시됩니다. 위 코드처럼 getDimensionPixelSize()를 사용해야 실제 높이 값이 픽셀 단위로 출력됩니다.
4단계 — AndroidManifest.xml
이 기능에는 별도의 권한이 필요하지 않습니다. 매니페스트는 기본 구성 그대로 두면 됩니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.q11">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
앱 실행 및 결과 확인
실제 Android 기기를 컴퓨터에 연결한 상태에서 Android Studio 툴바의 Run(녹색 재생) 버튼을 클릭합니다. 기기 목록에서 자신의 스마트폰을 선택하면 앱이 실행되고, 화면 중앙에 내비게이션 바의 높이가 픽셀 단위로 표시됩니다.
추가로 알아두면 좋은 점
- 너비: 내비게이션 바의 가로 크기는 대부분의 기기에서 화면 전체 너비와 같습니다. 따라서
resources.displayMetrics.widthPixels값을 그대로 활용할 수 있습니다. - 제스처 내비게이션: 하단 버튼 대신 제스처를 사용하는 기기에서는 내비게이션 바 높이가 더 작게 측정될 수 있습니다.
- px → dp 변환: 반환되는 값은 픽셀 단위이므로, dp 값이 필요하다면 해당 값을
resources.displayMetrics.density로 나누어 변환하면 됩니다.