appcompat 라이브러리 - API 호환성 해결
dependencies{
implementation 'androidx.appcompat:appcompat:1.5.1'
}
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
}
액션바
- 화면 위쪽 타이틀 문자열이 출력되는 영역
- 액티비티 창 = 액션바 + 콘텐츠 영역(
setContentView()
출력 영역)
- 내비게이션 아이콘(햄버거), 타이틀, 액션 아이템, 오버플로 메뉴 등으로 구성
색상 설정
- 기본적으로 res/values 의 themes.xml 파일 내용으로 설정되며 manifest파일에 선언되어있다.
<application ...
android:theme="@style/Theme.DoitKotlin3"
...>
- 색 종류
- colorPrimary : 액션바와 버튼의 배경 색
- colorSecondary : 활성 상태의 색
- statusBarColor : 상태바의 배경색
- colorOnPrimary, colorOnSecondary : colorPrimary, colorSecondary 색이 적용 되는 부분의 콘텐츠 색(forground color)
- colorPrimaryVariant, colorSecondaryVariant : 그림자 색
- 해당 색을 바꾸는 것 만으로 앱의 기본 색상을 변경 할 수 있다.
숨기기 설정
- themes.xml 에 NoActionBar 설정
<style name="Theme.DoitKotlin3" parent="Theme.MaterialComponents.DayNight.NoActionBar">
- 다른 방법으로 style내부 item으로 설정할 수 있다.
<style name="Theme.DoitKotlin3" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
...
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
업 버튼 설정
- 액티비티의 첫 화면이 아닐때 뒤로 가기 기능
- 취소 버튼 뿐만 아니라 화살표 모양의 업 버튼으로도 뒤로갈 수 있다.
- 매니페스트 파일에서 parentActivityName 설정 ( 업버튼도 같이 나옴 )
<activity android:name=".SecondActivity"
android:parentActivityName=".MainActivity"></activity>
override fun onSupportNavigateUp(): Boolean {
Log.d("lumineko","Click Up")
return super.onSupportNavigateUp()
}
- 액티비티 코드에서 업버튼 생성. parent Activity 설정이 되어있지 않으므로 onBackPressed() 등의 함수 호출로 직접 컨트롤 해줘야 한다.
override fun onCreate(savedInstanceState: Bundle?) {
...
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
override fun onSupportNavigateUp(): Boolean {
Log.d("lumineko","Click Up")
onBackPressed()
return super.onSupportNavigateUp()
}
메뉴 구성
- 오버플로 + 액션아이템
- 메뉴 추가 함수
- onCreateOptionsMenu() : 액티비티 실행 시 처음 한번 만 호출 ( 주로 사용 )
- onPrepareOptionsMenu() : 액티비티 실행 시 한번 호출 + 오버플로 메뉴 나올때마다 반복 실행 ( 동적으로 메뉴를 변경할 필요가 있을 때 사용 )
- 메뉴 추가 코드
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
val menuItem1: MenuItem? = menu?.add(0,0,0, "menu1")
val menuItem2: MenuItem? = menu?.add(0,1,0, "menu2")
return super.onCreateOptionsMenu(menu)
}
- add() 함수의 두번째 매개변수는 메뉴의 식별자(itemId)로 어떤 메뉴를 클릭했는지 확인할 때 사용한다.
- 메뉴 선택 이벤트 처리 코드
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when(item.itemId){
0-> {
Log.d("lumineko", "menu1")
true
}
1->{
Log.d("lumineko", "menu2")
true
}
else-> super.onOptionsItemSelected(item)
}
}
리소스로 메뉴 구현하기
- 메뉴는 대부분 정적으로 구현되므로 리소스 XML 파일로 구성하는 경우가 많다.
- res폴더 아래 menu 디렉토리에 작성한다.
<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>
<item
android:id="@+id/menu2"
android:title="menu2"
android:icon="@android:drawable/ic_menu_add"
app:showAsAction="always"></item>
<item
android:id="@+id/menu3"
android:icon="@android:drawable/ic_menu_search"
android:title="menu2"
app:showAsAction="ifRoom"></item>
</menu>
- showAsAction 속성
- never : 항상 오버플로로 숨김
- ifRoom : 액션바 자리가 있으면 액션 아이템으로, 아니면 오버플로
- always : gkdtkd 액션 아이템으로 출력
- 코드에 적용
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return super.onCreateOptionsMenu(menu)
}
액션 뷰 이용
- 액션바에서 특별한 기능을 제공한다.(ex. 클릭하면 입력값을 받는 서치뷰)
- SearchView를 XML에 적용한 것만으로 검색입력창이 출력된다.
<item
android:id="@+id/menu3"
android:icon="@android:drawable/ic_menu_search"
android:title="menu2"
app:showAsAction="always"
app:actionViewClass="androidx.appcompat.widget.SearchView"></item>
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
val menuItem = menu?.findItem(R.id.menu3)
val searchView = menuItem?.actionView as SearchView
searchView.setOnQueryTextListener(object: SearchView.OnQueryTextListener{
override fun onQueryTextChange(p0: String?): Boolean {
return true
}
override fun onQueryTextSubmit(p0: String?): Boolean {
return true
}
})
return true
}
툴바
- 액션바와 같은 목적으로 사용한다.
- 액션바는 액티비티 창이 자동으로 출력하는 액티비티 구성 요소인 반면, 툴바는 개발자가 직접 제어하는 뷰다.
- 액션바는 자동으로 출력되어 편한 반면, 툴바는 직접 생성하는 대신 제어할 수 있는 기능이 많다.
- 툴바를 출력할 때는 액션바가 화면에 출력되지 않도록 설정해준다.
- XML에 Toolbar 추가
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/toolbar"
style="@style/Widget.MaterialComponents.Toolbar.Primary"
tools:ignore="MissingConstraints">
</androidx.appcompat.widget.Toolbar>
override fun onCreate(savedInstanceState: Bundle?) {
...
setSupportActionBar(binding.toolbar)
}
호환성을 고려한 뷰 클래스
- appcompat 라이브러리의 경우 대부분 플랫폼 API를 상속받아 호환성 문제를 해결해놓았기 때문에 가능하면 appcompat 을 사용하도록 한다.