11-2 appcompat 라이브러리

StrayCat·2022년 11월 10일
0

appcompat 라이브러리 - API 호환성 해결

dependencies{
	implementation 'androidx.appcompat:appcompat:1.5.1'
}
  • AppCompatActivity
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>
  • SearchView의 검색 기능 구현 함수
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>
  • 액티비티 onCreate()에 툴바 세팅
override fun onCreate(savedInstanceState: Bundle?) {
    ...
    setSupportActionBar(binding.toolbar)
}

호환성을 고려한 뷰 클래스

  • appcompat 라이브러리의 경우 대부분 플랫폼 API를 상속받아 호환성 문제를 해결해놓았기 때문에 가능하면 appcompat 을 사용하도록 한다.

0개의 댓글