개발 공부/안드로이드 31

StateFlow에 대해 알아보자! (with LiveData)

데이터를 관리할 때 특히, MVVM에 보통 사용이 많이 되는 것이 LiveData 입니다. LiveData란? 관찰 가능한 데이터 홀더 클래스 생명주기(Lifecycle)를 인식 하고 있기 때문에 생명주기가 끝나면 바로 메모리상에서 스스로 해제하여 메모리 누수가 일어나지 않습니다. (따로 관리를 할 필요가 없음) 앱 데이터가 변경될 때마다 관찰자가 대신 UI를 업데이트하므로 개발자가 업데이트할 필요가 없어 UI와 데이터의 상태가 일치 됩니다. 이러한 장점도 있지만 단점도 있는데, 안드로이드에서 권장하는 아키텍처 & 클린 아키텍처의 Domain Layer에서는 안드로이드 플랫폼에 독립적이기 때문에 안드로이드 플랫폼에 종속적인 LiveData를 사용하기가 어렵습니다. 즉, UI가 없는 곳에서는 사용하기가 어..

Compile과 Android Build

Compile 작성한 고급 언어를(Java, Kotlin 등) 컴퓨터가 읽을 수 있는 기계어(어셈블리어 등)로 변환하는 프로세스 Build 해당 코드를 컴파일 후 apk 파일(실행 파일)로 만드는 것 Build와 실행시 동작 리눅스 기반인 안드로이드는 apk의 일부를 리눅스에서 실행할 수 있는 파일로 한 번 더 컴파일 하고 AOT(Ahead of Time, 선행)로 작업을 한다. 그 후 앱이 실행되면 나머지를 JIT(Just-in-Time, 적기)로 컴파일을 하게 된다. AOT와 JIT로 나눠서 컴파일을 하는 이유는 처음에 전체를 컴파일하게 되면 속도는 빠르지만 그만큼 디스크에 많은 용량을 차지하게 되므로 장단점을 살려 2번 컴파일 하고 있다. 참고 안드로이드 개념) Complie, Build와 Grad..

[Compose] 컴포즈 공부하기3 - Row, Column 그리고 정렬

Row - 가로로 추가하고 싶을 때 사용 - XML에서 LinearLayout의 orientation="horizontal" 과 유사 Column - 세로로 추가하고 싶을 때 사용 - XML에서 LinearLayout의 orientation="vertical" 과 유사 Row [예제 1] Row { Text(text = "텍스트 1") Text(text = "텍스트 2") Text(text = "텍스트 3") } 텍스트를 연속으로 넣는다면 이렇게 결과값이 나온다. [예제 2] Row 자체에 크기를 지정해준다면? Row(modifier = Modifier .height(100.dp) .width(300.dp)) { Text(text = "텍스트 1") Text(text = "텍스트 2") Text(text..

[Compose] 컴포즈 공부하기2 - Surface, Box 어떤 차이가 있을까?

Surface - Material Design 스타일이다. (elevation, shape, color..) - light/dark 테마에 따라 적용 가능 - XML의 MaterialCardView와 유사 Box - 단순히 container로써 역할 - 정렬, 간격 등을 적용하기 유용 예시를 통해 비교해 보자! 1. 동일하게 만들기 Column { Surface( modifier = Modifier.padding(5.dp), color = Color.Green ) { Text( text = "Hello $name!", modifier = Modifier.padding(8.dp) ) } Box( modifier = Modifier.padding(5.dp).background(Color.Green) ) { ..

[Compose] 컴포즈 공부하기1 - Modifier 란?

Modifier 다음과 같은 작업을 할 수 있다. 컴포저블의 크기, 레이아웃, 동작 및 모양 변경 접근성 라벨과 같은 정보 추가 사용자 입력 처리 요소를 클릭 가능, 스크롤 가능, 드래그 가능 또는 확대/축소 가능하게 만드는 높은 수준의 상호작용 추가 Text를 통해 알기 쉽게 몇가지 예시를 알아보자. 1. 기본 Text Text( color= Color.Blue, text = "Hello, Android") Modifier를 주지 않은 기본 Text는 이렇게 나오게 된다. 2. 크기 Text( color= Color.Blue, text = "Hello, Android", modifier = Modifier.size(100.dp) // 또는 Modifier.size(width = 100.dp, heigh..

android recyclerview 화면에 보이는 아이템 위치와 activity에서 수정하기

목표 : 스크롤 할 때마다 현재 recyclerview에서 보이는 위치를 가져와서 activity에서 recyclerview item의 백그라운드 색을 수정 1. 현재 보이는 아이템 위치 가져오기 findFirstVisibleItemPosition() findFirstCompletelyVisibleItemPosition() findLastCompletelyVisibleItemPosition() findLastVisibleItemPosition() findFirstVisibleItemPosition, findLastVisibleItemPosition은 화면에서 가장 상단, 하단에 보이는 아이템의 위치로서 전체가 온전히 보이지 않고 일부만 보이는 상태이다. findFirstCompletelyVisibleIt..

android textView의 text 복사하기-(ClipboardManager, textIsSelectable)

textView의 text를 복사하는 데에는 2가지 방법이 있다. text를 선택할 수 있게 하는 textIsSelectable을 사용하는 방법과 clipboard를 사용하는 방법이 있다. ​ 1. textIsSelectable ​ TextView에 textIsSelctable을 true로 하면 textView를 롱클릭했을 경우 선택이 가능해진다. (textColorHighlight에 색을 넣는 다면 해당색으로 선택이 된다.) ​ 일반 텍스트, 주소, 전화를 두고 롱클릭을 한다면 위의 사진 처럼 자동으로 인식해서 주소일 때는 지도, 전화번호일 때는 전화걸기가 뜬다. ​ ​ 2. ClipBoardManager 보통 롱클릭시 작업을 하며, 선택이 없이 원하는 텍스트를 코드로 지정하여 클립보드에 넣게한다. v..

recyclerview 더 효율적으로 사용하기 - ListAdapter와 DiffUtil

기존에 reyclerview의 adapter를 만드려면 Reyclerview.Adapter을 사용해왔다. 해당 방식을 사용하려면 어뎁터 내의 리스트도 관리를 해야했고 데이터를 넣거나 변경, 삭제하는 등이 변화가 있을 경우 일일이 변경처리를 해야했다. (notifyItemInserted(), notifyItemRemoved(), notifyItemRangeChanged().....) ​ 변동이 있어 전체 내역을 업데이트 해야해서 내역을 삭제하고 다시 불러오는 경우, 몇 개만 변동되는데 전체를 업데이트 하다보니 지연시간이 있을 수 밖에 없고 그만큼의 불필요한 비용도 생기게 된다. ​ 이러한 비용을 줄이고자 나온게 DiffUtil 이고, 이 DiffUtil을 활용해 리스트를 업데이트 시키는 기능을 가진 것이 ..

android contextMenu - 선택지 띄우기, recyclerview

contextMenu란? 윈도우에서 해당 화면에 오른쪽 클릭을 했을 때 나오는 메뉴(선택지)처럼 안드로이드에서도 동일하게 해당 뷰를 길게 클릭하면 나오는 메뉴들을 말한다. 1. activity에서 contextMenu 사용하기 예시) 전화번호를 클릭하면 해당 전화번호를 전화를 걸지, 메시지를 보낼지, 복사할 지 선택하는 메뉴 띄우기 1-1 해당 반응을 받을 뷰를 작성→registerForContextMenu(해당 뷰) 1-2 onCreateContextMenu 에 띄울 메뉴 설정 override fun onCreateContextMenu( menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo? ) { super.onCreateContex..

Android Room 2 - 적용하기

Room을 적용하여 대학교의 학생 목록을 관리하는 예시를 만들어보았다. [구현 사항] db의 필요사항 - Primary key로 있을 id 값, 이름, 전공 삭제/추가 구현 vararg 테스트를 위한 리스트 추가 id 값은 자동으로 계산해서 추가(+1씩) * viewBinding 사용, 코틀린으로 작성되었습니다. enum class Major(val korName:String) { ECONOMICS("경제학과"), BIOLOGY("생물학과"), LAWS("법학과"), ACCOUNTING("회계학과"), HISTORY("역사학과") } 1. Entitiy @Entity(tableName = "student") data class Student( var name : String? = null, var maj..