플랫폼 API는 ART(Android Runtime)에서 제공하는 안드로이드 앱의 핵심 라이브러리다. ART는 대부분 android 또는 java로 시작하는 패키지명을 사용한다.
ex) java.lang.String, java.util.Date
이전에 배웠던 것처럼 안드로이드 앱은 런타임 때 ART에 의해 실행되므로 ART에서 제공하는 플랫폼 API를 이용해 개발한다. 그런데 플랫폼 API를 이용하면 사용자 기기의 버전이 달라서 호환성 문제가 발생할 수 있다.
또한 플랫폼 API는 기본 재료일 뿐, 실제 앱을 개발할 때는 더 다양한 기능과 화면을 구현해야 한다. (요리에서 MSG 느낌)
따라서 구글은 2018년에 제트팩이라는 라이브러리 모음을 발표했다.
Jetpack은 개발자가 중요한 코드에 집중할 수 있도록 권장사항 준수, 상용구 코드 감소, 여러 Android 버전과 기기에서 일관되게 작동하는 코드 작성을 돕는 라이브러리 묶음이다.
제트팩은 크게 3가지 목적으로 제공한다.
1. 앱을 개발하는 데 필요한 권장 아키텍처를 제공한다.
2. API 레벨의 호환성 문제를 해결한다.
3. 플랫폼 API에서 제공하지 않는 다양한 기능을 제공한다.
제트팩은 API 레벨의 호환성 문제를 해결해 준다.
예를 들어, 21버전에 추가된 Toolbar 클래스를 (android.widget.Toolbar)사용하면 원래는 호환성 문제가 발생하지만, 제트팩에서 제공하는 Toolbar 클래스를(androidx.appcompat.widget.Toolbar) 사용한다면 호환성 문제가 발생하지 않는다.
따라서 목적이 같은 클래스를 제트팩 라이브러리에서도 제공하면 대부분 제트팩의 클래스를 사용한다.
제트팩에는 androidx 패키지명으로 시작하는 다양한 라이브러리가 있다.
화면 구성에 관련된 라이브러리는 다음과 같다.
appcompat 라이브러리는 정말 자주 사용된다.
이 라이브러리는 안드로이드 앱의 화면을 구성하는 액티비티를 만들며 API 레벨의 호환성 문제를 해결해 준다.
툴바(Toolbar)와 액션바(ActionBar)는 안드로이드 앱에서 UI의 일부분으로, 둘 다 앱 상단에 위치하며 주로 내비게이션, 제목 표시, 메뉴 등의 역할을 합니다. 하지만 둘 사이에는 몇 가지 중요한 차이점이 있다.
Toolbar
로 대체하는 것이 권장된다.Toolbar
는 ActionBar
를 대체할 수 있는 더 유연하고 커스터마이징 가능한 UI 요소이다.Toolbar
는 ActionBar
와 달리 앱 내 어디에나 배치할 수 있다(예: 화면 하단, 상단).Toolbar
는 더 많은 기능과 디자인 옵션을 제공한다. 예를 들어, 버튼, 서브타이틀, 커스텀 뷰 등을 추가할 수 있다.ActionBar
보다 더 유연하고 커스터마이징이 가능한 UI 요소로, 최신 앱 개발에서는 Toolbar
를 사용해 ActionBar
를 대체하는 것이 일반적이다.<resources>
<!-- Base application theme -->
<style name="Base.Theme.AndroidLab" parent="Theme.Material3.DayNight.NoActionBar">
<item name="colorPrimary">#FF0000</item>
<item name="android:statusBarColor">#CC0000</item>
<item name="colorAccent">#00FF00</item>
</style>
</resources>
툴바의 색깔을 바꿀수도 있다.
툴바의 색깔을 바꾸려면 styles.xml을 만든 후 거기에 지정하면 된다.
업버튼(Up Button)은 주로 안드로이드 앱에서 사용되는 네비게이션 요소로, 사용자가 현재 화면에서 이전 화면으로 돌아갈 수 있도록 도와준다.
ex) 업버튼은 유튜브 앱에서 현재 화면의 상위 계층으로 돌아갈 때 사용된다. 예를 들어, 특정 비디오를 보고 있을 때 화면의 상단에 있는 업버튼을 클릭하면 사용자는 해당 비디오를 포함한 채널 페이지로 돌아가게 된다. 이는 비디오가 채널 페이지의 하위 계층에 위치하기 때문이다.
ex) 백버튼은 유튜브 앱에서 가장 최근에 방문한 화면으로 돌아가는 데 사용된다.
예를 들어, 사용자가 비디오 목록을 보고 있다가 특정 비디오를 클릭해서 시청을 시작한 경우, 백버튼을 클릭하면 사용자는 다시 비디오 목록 화면으로 돌아가게 된다. 이는 사용자가 가장 최근에 방문했던 화면으로 돌아가는 것이다.
보통 메뉴를 구성할 때는, 액티비티의 메뉴는 대부분 정적으로 제공되므로 리소스 XML 파일로 구성한다. 메뉴를 구성하는 XML 파일은 res 폴더 아래 menu 디렉터리에 만든다.
<?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/menu1"
android:title="menu1" />
<item
android:id="@+id/menu2"
android:icon="@android:drawable/ic_menu_add"
android:title="menu2"
app:showAsAction="always" />
<item
android:id="@+id/menu3"
android:icon="@android:drawable/ic_menu_search"
android:title="menu3"
app:showAsAction="ifRoom" />
</menu>
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return super.onCreateOptionsMenu(menu)
}
app:showAsAction 속성이 없으므로, 기본적으로 툴바에 표시되지 않고 오버플로(점선 3개) 메뉴에 들어간다.
app:showAsAction="always"로 설정되어, 항상 툴바에 표시된다.
이 아이콘은 +로 나타나고, 툴바에 직접 보인다.
app:showAsAction="ifRoom"으로 설정되어, 툴바에 공간이 있을 경우 표시된다.
이 아이콘은 돋보기 아이콘으로 나타나며, 툴바에 직접 보인다.
오버플로 메뉴는 툴바에 표시되지 않는 항목들을 담는 메뉴이다.
현재 menu1만 오버플로 메뉴에 있다.
menu2와 menu3는 툴바에 직접 표시되므로, 오버플로 메뉴에 포함되지 않는다.
만약 툴바에 +, 돋보기 아이콘이 보이지 않고, 점선 3개를 눌렀을 때 menu1, menu2, menu3가 모두 보이길 원한다면, app:showAsAction 속성을 모두 never(기본값)로 수정해야 한다.
액션뷰는 액션바에서 특별한 기능을 제공하며 대표적으로 androidx.appcompat.widget.SearchView가 있다. 이는 검색 기능을 제공한다.
<item
android:id="@+id/action_search"
android:icon="@android:drawable/ic_menu_search"
android:title="Search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView" />
// mainActivity.kt
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
// searchView 설정
val searchItem = menu?.findItem(R.id.action_search)
val searchView = searchItem?.actionView as SearchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
// 사용자가 검색어 입력 후 제출 버튼을 눌렀을 때 실행
// 검색어 처리 로직 추가
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
// 사용자가 검색어를 입력할 때마다 실행
// 검색어 변경 시 처리 로직 추가
return false
}
})
return super.onCreateOptionsMenu(menu)
}
app:actionViewClass="androidx.appcompat.widget.SearchView"
: menu3 항목을 SearchView로 설정한다. 이로 인해 사용자가 검색 아이콘을 클릭하면 SearchView가 펼쳐진다.
app:showAsAction="ifRoom|collapseActionView"
: SearchView가 툴바에 공간이 있을 때 표시되며, 아이콘을 클릭하면 펼쳐지고 다시 클릭하면 축소된다.
setOnQueryTextListener:
SearchView에 리스너를 설정하여, 사용자가 입력한 검색어에 대해 실시간으로 처리하거나, 검색어 제출 시 특정 작업을 수행할 수 있다.
return false
: return false를 사용함으로써, SearchView가 제공하는 기본 동작을 유지하면서도 추가적인 작업을 수행할 수 있다. 기본적으로 사용자가 입력한 텍스트에 대한 자동 검색어 필터링, 검색 UI의 상태 변경 등의 기본 처리를 계속하고 싶을 때 false를 반환한다. 즉, true를 반환하면 이벤트 처리가 중단되기 때문에, 기본 동작을 원하지 않거나 이벤트 처리를 커스텀하고자 할 때 사용한다.
플랫폼 API: 안드로이드 앱의 핵심 라이브러리로, ART(Android Runtime)에서 제공한다. 호환성 문제 발생 가능.
제트팩(Jetpack): 안드로이드 앱 개발을 돕는 라이브러리 묶음으로, 권장 아키텍처 제공, 호환성 문제 해결, 다양한 기능 제공.
androidx 라이브러리: Jetpack에 속하는 라이브러리로, 다양한 화면 구성 기능을 제공한다.
appcompat 라이브러리: 안드로이드 앱의 API 레벨 호환성을 해결하며, 화면 구성에 자주 사용된다.
Toolbar와 ActionBar: Toolbar는 커스터마이징이 가능하고 위치를 자유롭게 변경할 수 있는 최신 UI 요소로, ActionBar를 대체한다.
업버튼: 현재 화면에서 상위 계층으로 돌아가는 네비게이션 버튼으로, 백버튼과는 목적이 다르다.
메뉴 구성: 메뉴는 XML 파일로 정의되며, app:showAsAction 속성에 따라 툴바에 직접 표시되거나 오버플로 메뉴에 들어간다.
액션뷰(SearchView): 툴바에 검색 기능을 추가할 수 있는 UI 요소로, 사용자가 입력한 검색어를 처리하는 기능을 제공한다.