appcompat 라이브러리
androidx 라이브러리에서 가장 많이 사용하는 appcompat 라이브러리는 안드로이드 앱의 화면을 구성하는 액티비티를 만들며 API 레벨의 호환성 문제를 해결해 줍니다. appcompat 라이브러리를 사용하려면 그래들 파일의 dependencies 항목(의존성 설정)에 다음처럼 선언해 야 합니다. 그런데 이 선언은 안드로이드 스튜디오에서 모듈을 만들 때 자동으로 추가됩니다.
implementation 'androidx.appcompat:appcompat:1.3.1'
appcompat 라이브러리를 이용해서 액티비티를 만들 때는 플랫폼 API의 Activity가 아니 라 다음처럼 appcompat의 AppCompatActivity 클래스를 상속받아 작성합니다.
import androidx.appcompat.app.AppCompatActivity
(... 생략 ...)
class MainActivity : AppCompatActivity() {
}
액션바
액션바 액티비티의 구성 요소인 액션바 는 화면 위 쪽에 타이틀 문자열이 출력되는 영역을 의미합니다. 액티비티가 출력되는 전체 창은 액션바와 콘텐츠 영역으로 구분됩니다. 액션바 영역에는 기본으로 타이틀이 출력됩니다. 그리고 콘텐츠 영역에는 setContentView() 함수가 출력하는 내용이 출력 됩니다.
액션바의 기본 구성은 다음과 같습니다. 타이틀은 보이지 않게 설정할 수도 있으며 그밖에 내비게이션 아이콘, 액션 아이템, 오버플로 메뉴 등 다양한 요소를 액션바에 출력할 수 있습니다.
액션바 색상 설정
액션바의 색상은 이 앱에 자동으로 적용되는 테마에서 결정됩니다. 테마 스타일은 res/values 디렉터리에 있는 themes.xml 파일에 선언됩니다.
테마 파일의 내용 예시
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- 기본 테마 -->
<style name="Theme. AndroidLab" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- 주 색상 -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- 부 색상 -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- 상태바 색상 -->
<item name="android:statusBarColor" tools:targetApi="1">?attr/colorPrimaryVariant</item>
<!-- 기본 테마 설정 -->
</style>
</resources>
이름이 Theme.AndroidLab 인 스타일이 기본으로 선언되어 있습니다. 이 스타일이 매니페스트 파일에 테마로 설정됩니다. 스타일 이름에서 AndroidLab은 프로젝트 이름입니다.
매니페스트 파일의 테마 설정
<application
(... 생략 ....)
android:theme="@style/Theme. AndroidLab">
themes.xml 파일의 스타일이 앱의 액티비티에 테마로 자동 설정되고 이 테마 파일에 선언된 색상이 액티비티에 적용됩니다. 이 스타일은 머티리얼 디자인에서 제공하는 Theme.MaterialComponents.DayNight.DarkActionBar를 상속받아 작성됩니다.
colorPrimary와 colorSecondary는 앱의 브랜드를 표현하는 색상입니다. colorPrimary는 액션바와 버튼의 배경색으로 사용하고 colorSecondary는 활성 상태를 표현합니다. 즉, 텍스트 뷰의 링크, 체크박스나 라디오 버튼이 체크되었을 때, 스위치가 켬(on) 상태일 때, 플로팅 액션 버튼의 배경색 등에 colorSecondary를 사용합니다. 그리고 statusBarColor는 상태바의 배경색으로 사용합니다.
또한 coloronPrimary, colorOnSecondary는 colorPrimary, colorsecondary가 적용되는 곳에서 내용의 전경색으로 사용합니다. 그리고 colorPrimaryVariant, color SecondaryVariant는 그림자의 색상으로 사용합니다.
테마 파일의 각 색상값을 변경하는 것만으로도 앱의 기본 색상을 변경할 수 있습니다.
액션바 숨기기 설정
액티비티의 창은 기본으로 액션바를 포함합니다. 그런데 때로는 액션바를 출력하고 싶지 않을 때도 있습니다. 액티비티에 액션바를 숨기는 것도 테마 파일에서 설정할 수 있습니다. 테마를 만들 때 Theme.MaterialComponents.DayNight. NoActionBar를 상속받으면 액션 바가 나오지 않습니다.
액션바 숨기기
<style name="Theme.AndroidLab" parent="Theme.MaterialComponents.DayNight.NoActionBar">
(... 생략 ...)
</style>
만약 NoActionBar 테마를 상속받아 작성할 수 없는 경우라면 테마의 <item> 속성을 다음처럼 설정하여 액션바가 나타나지 않게 할 수도 있습니다.
<style name="Theme.AndroidLab"
parent="Theme.MaterialComponents.Daylight.DarkActionBar">
(... 생략 ...)
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
업 버튼 설정
업 버튼은 액티비티 화면이 앱의 첫 화면이 아닐 때 이전 화면으로 되돌아가는 기능을 합니다. 물론 안드로이드폰은 뒤로 가기 버튼이 따로 있어서 언제든지 이전 화면으로 되돌아갈 수 있지만, 액션바 왼쪽에 이전 화면으로 되돌아가는 화살표 모양(←)의 업 버튼을 제공할 수도 있습니다.
업 버튼은 액티비티가 등록되는 매니페스트 파일에서 설정하는 방법과 액티비티 코드로 설정하는 방법이 있습니다.
매니페스트 파일에서 업 버튼 설정
<activity
android:name=".TwoActivity"
android:parentActivityName=".MainActivity">
</activity>
매니페스트 파일에서 <activity> 태그에 parentActivityName 속성을 등록하는 것만으로도 액티비티 화면에 업 버튼이 나옵니다. 그래서 사용자가 이 버튼을 누르면 이전 화면으로 되돌아갑니다.
업 버튼을 눌렀을 때 이전 화면으로 되돌아가기 전에 특별한 로직을 실행하고 싶을 때는 액티비티에 onSupportNavigateUp() 함수를 재정의합니다. 이렇게 재정의하면 사용자가 업 버튼을 누를 때 onSupportNavigateUp() 함수가 자동으로 호출됩니다.
override fun onSupportNavigateUp(): Boolean {
Log.d("kkang","onSupportNavigateUp")
return super.onSupportNavigateup
}
액티비티 코드로 설정하는 방법이
class TwoActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
(... 생략 ...)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
override fun onSupportNavigateup(): Boolean {
Log.d("kkang", "onSupportNavigateUp")
onBackPressed()
return super.onSupportNavigateup()
}
}
supportActionBar?.setDisplayHomeAsUpEnabled(true) 구문으로 액션바에 업 버튼이 나옵니다. 이때에도 업 버튼을 클릭하면 onSupportNavigateUp() 함수가 자동으로 호출됩니다. 그런데 매니페스트 파일의 parentActivityName 속성이 설정되어 있지 않으면 자동으로 이전 화면으로 되돌아가지 않습니다. 따라서 앞의 코드처럼 onSupportNavigateUp() 함수에서 onBackPressed() 구문 등으로 이전 화면으로 되돌아가는 코드를 직접 작성해 줘야 합니다.
참고
https://developer.android.com/jetpack/androidx/releases/appcompat?hl=ko