제트팩 라이브러리 안드로이드 스튜디오 appcompat 라이브러리

2022. 12. 8. 01:34_Study/AndroidStudio

728x90

12-1 제트팩과 androidx 소개 🐇¸.•*¨*•¸.•*¨*•¸.•*¨*•¸.•*¨*•

해당 자료는 강의 학습자료이며, Do it! 깡샘의 안드로이드 앱 프로그래밍 with 코틀린을 참고하였습니다.


플랫폼 API는 ART에서 제공하는 안드로이드 라이브러리이다.

 

제트팩은 구글에서 안드로이드 앱 개발용으로 제공하는 다양한 라이브러리 모음으로 androidx로 시작하는 패키지명을 사용한다. 제트팩은 앱을 개발하는 데 필요한 권장 아키텍처를 제공하고 API 호환성 문제를 해결하며 플랫폼 API에서 제공하지 않는 다양한 기능을 제공한다.

 

 

androidx 라이브러리 : 화면 구성과 관련된 라이브러리

androidx.appcompat: 앱의 API 레벨 호환성을 해결
androidx.recyclerview: 목록 화면을 구성
androidx.viewpager2: 스와이프로 넘기는 화면을 구성
androidx.fragment: 액티비티처럼 동작하는 뷰를 제공
androidx.drawerlayout: 옆에서 서랍처럼 열리는 화면을 구성

 

 

 

 

12-2 appcompat 라이브러리 🐇¸.•*¨*•¸.•*¨*•¸.•*¨*•¸.•*¨*•


 appcompat 라이브러리는 안드로이드 앱의 화면을 구성하는 액티비티를 만들며 API 레벨의 호환성 문제를 해결

자동으로 추가된다.

implementation 'androidx.appcompat:appcompat:1.5.1'

 

 

 

액션바

화면 위쪽에 타이틀 문자열이 출력되는 영역
내비게이션 아이콘, 액션 아이템, 오버플로 메뉴 등 다양한 요소를 액션바에 출력할 수 있다.

res/values 안에 있는 themes.xml 에 선언한다.

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item> //액션바, 버튼의 배경색
        <item name="colorPrimaryVariant">@color/purple_700</item> //그림자 색상
        <item name="colorOnPrimary">@color/white</item> //colorPrimary가 적용되는 곳의 전경색

        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item> //활성 상태(텍스트 뷰의 링크, 체크박스나 라디오 버튼이 체
        크되었을 때, 스위치 켬 상태, 플로팅 액션 버튼의 배경색)

        <item name="colorSecondaryVariant">@color/teal_700</item> //그림자 색상
        <item name="colorOnSecondary">@color/black</item> //colorSecondary가 적용되는 곳의 전경색
        <!-- Status bar color. -->
        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item> //상태바의 배경색
        <!-- Customize your theme here. -->
    </style>
</resources>

manifest 파일의 테마 설

 

액션바 숨기기 설정

<style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.NoActionBar">

 

 

업 버튼 설정

: 액션바 왼쪽에 이전 화면으로 되돌아가는 화살표 모양의<- 업버튼을 제공할 수 있다.

 

supportActionBar?.setTitle(“Title”)

매니페스트 파일에서 업 버튼 설정

binding.btn.setOnClickListener {
    val intent = Intent(this, TwoActivity::class.java)
    startActivity(intent)
}

 

매니페스트 파일에 parentActivityName 속성 선언없이 코드에서 업 버튼을 생성할 수 있다.

supportActionBar?.setDisplayHomeAsUpEnabled(true)

 

 

 

메뉴 구성

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)
}

메뉴는 액션바의 중요한 구성 요소로 액티비티 화면에서 사용자 이벤트를 사용할 수 있도록 합니다.
액티비티에 메뉴를 추가하고 싶다면 onCreateOptionsMenu()와 onPrepareOptionsMenu() 함수를 이용
onCreateOptionsMenu() 함수는 액티비티가 실행되면서 처음에 한 번만 호출
onPrepareOptionsMenu() 함수는 액티비티가 실행되면서 한 번 호출된 후 오버플로 메뉴가 나타날 때마다 반복해서 호출

 

 

메뉴를 사용자가 선택했을 때 이벤트 처리는 onOptionItemSelected()함수를 이용한다.

함수의 매개변수는 이벤트가 발생한 메뉴 객체인 MenuItem

 

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)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean = when(item.itemId) {
    0->{
        binding.textView.text = "0을 선택하셨어요"
        true
    }
    1->{
        binding.textView.text = "1을 선택하셨어요"
        true
    }
    else -> super.onOptionsItemSelected(item)
}

 

 

 

리소스로 메뉴 구현

메뉴를 구성하는 XML 파일은 res 폴더 아래 menu 디렉토리를 만든다.

menuInflater.inflate(R.menu.menu_main,menu)

액션바에 아이콘으로 나타나게 하려면 showAsAction 속성을 이용
-  never(기본): 항상 오버플로 메뉴로 출력한다.
- ifRoom: 만약 액션바에 공간이 있다면 액션 아이템으로, 없다면 오버플로 메뉴로 출력한다.
- always: 항상 액션 아이템으로 출력한다.

 

menu_main.xml

<?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>

액션 뷰는 액션바에서 특별한 기능을 제공하며 대표적으로 androidx.appcompat.widget.SearchView가 있다. (돋보기) 누르면 검색으로 넘어간다. SearchView를 등록한 MenuItem 객체를 얻고 MenuItem 객체에 등록된 SearchView 객체를 구하면 된다.

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    val inflater = menuInflater
    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(newText: String?): Boolean {
            return true
            //검색어 변경 이벤트
            binding.textView.text = newText
        }

        override fun onQueryTextSubmit(query: String?): Boolean {
            return true
            // 키보드의 검색 버튼을 클릭한 순간의 이벤트
            binding.textView.text = "검색하실건가요?"
        }
    })
    return true
    //return super.onCreateOptionsMenu(menu)
}

어라.. 내 생각대로 안 돌아간다.

 

 

 

툴바

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="@style/Widget.MaterialComponents.Toolbar.Primary"/>
setSupportActionBar(binding.toolbar)

액션바는 액티비티 창이 자동으로 출력하는 액티비티의 구성 요소지만, 툴바는 개발자가 직접 제어하는 뷰라는 데
차이점이 있다.

액티비티 테마 설정 파일(themes.xml)에서 액션바 숨기기 설정 후
레이아웃 XML 파일에 다음처럼 Toolbar를 등록

 

호환성을 고려한 기본 뷰 클래스

플랫폼 API에서 제공하는 기본 뷰를 appcompat 라이브러리에서도 제공
- TextView 클래스를 appcompat 라이브러리에서는 AppCompatTextView라는 클래스명으로 제공

- AppCompatImageView, AppCompatEditText, AppCompatButton, AppCompatCheckBox, AppCompatRadioButton 등 기
본 뷰에 해당하는 뷰를 제공