안드로이드

Android

Android Fold Device 대응하기

기능이 필요해진 배경이번에 새로운 앱을 준비하며 폴드(플립이 아닌) 디바이스인지 확인해야만 하는 상황이 생겼다. 그렇게 폴드 디바이스인 경우, layout constraints를 조정해 다른 UI를 구성해주기 위함이었다. 다만, 폴드 디바이스를 어떻게 체크할 것인가에 대해 찾아보던 중"2가지 조건을 충족하면 폴드 디바이스다!" 라는 결론을 낼 수 있었다. 1번째 조건WindowInfoTracker를 사용해 폴더블 디바이스인지 확인하는 것이다. developer 사이트 문서에서 확인해보면WindowInfoTracker에서 FoldingFeature가 있는 경우, 폴더블 디바이스라는 것을 알 수 있다. https://developer.android.com/develop/ui/compose/layouts/ad..

Android

Android Material Theme Elevation 해제하기

Material theme을 사용하면서 왜 Elevation 설정을 해제하려고 할까앱에서 원하는 색상을 적용하기 어렵다. Material theme만 적용하게 되면 상관이 없겠지만,iOS나 다른 플랫폼과 색상을 맞추기 위해서는 Material theme만을 사용할 수가 없다. 왜 하필 elevation이냐... 그건 바로 elevation을 통해 shadow를 적용했는데Material theme 설정 때문에 내가 지정한 View의 backgroundTint를 적용할 수 없었다. 예를 들면?MaterialCardView가 있다. Appcompat의 CardView를 상속받아 만들어졌는데cardElevation을 0 초과로 설정하는 순간 내 기본 테마 색상에서더 진한 채도를 가진 색상으로 background..

Language/Kotlin

CoroutineScope와 CoroutineContext 되짚어보기

CoroutineScope(이하 Scope)는 CoroutineContext(이하 Context)라는 하나의 프로퍼티를 가지고 있다. 더불어 모든 Coroutine은 특정 Scope에서 실행된다. 그리고 여러 개의 Coroutine은 같은 Scope에서 실행될 수 있다. 특정 Coroutine과 그 자식 Coroutine을같은 Scope에서 실행하게 되면 Job 객체들이 부모-자식 계층을 구성하게 된다. 이렇게 형성된 부모-자식 계층은 구조적 동시성에서 중요한 부분이다. 같은 Scope에서 실행된 Coroutine은기본적으로 해당 Scope의 Context를 상속받는다. 하지만 각 Coroutine은 다른 Context로 실행될 수 있고,이것도 계층 구조를 따라 특정 Coroutine이 A라는 Conte..

Language/Kotlin

withContext로 스레드 전환하기

저번 글에서 예고했던 대로 메인 스레드에서 했던 무거운 작업을 이제 다른 스레드에서 작업시켜보자.(이전 글 확인하기) 이전 동작 이해하기아까 첨부한 링크에서의 이전 글을 보면우리는 viewModelScope를 사용해 CPU 연산이 무거운 작업을 메인 스레드에서 실행했다. 그렇게 수초간 메인 스레드가 blocking되었고, 다른 UI는 반응할 수 없었다. 그리고 우리가 실행했던 viewModelScope의 Context를 확인하는 방법이 하나 있다.fun performCalculationOnMain(factorial: Int) { viewModelScope.launch { println("Coroutine Context: $coroutineContext") var result = BigInt..

Language/Kotlin

Coroutines Dispatcher 알아보기

이번 글은 저번 CoroutineContext와 CoroutineScope를 소개한 것에 이어서 Dispatcher에 대해 알아보겠다. Dispatcher의 역할Dispatcher는 해당 코루틴이 어느 스레드나 스레드 풀에서 실행될지 결정한다. Dispatcher의 종류Dispatcher는 이미 정의된 몇가지가 있는데 이에 대해 짧막하게 알아보자. Dispatchers.MainMain Dispatcher는 오직 UI가 있는 애플리케이션에서만 사용할 수 있다. 안드로이드의 경우, UI 작업을 오직 메인 스레드에서만 허용하므로Main Dispatcher를 사용해 메인 스레드에서 실행할 수 있다. 해당 Dispatcher가 Main Looper와 연결된 Handler를 사용하기 때문이다. 우리가 Main Di..

Language/Kotlin

CoroutineContext와 CoroutineScope 알아보기

이번에는 CoroutineContext는 대체 무엇인지 알아보자. 그리고 간단히 CoroutineScope 구조까지 살펴보도록 하겠다. viewModelScope로 찾아보기viewModelScope는 CoroutineScope라는 인터페이스를 상속받아 만들어진 녀석이다. 그리고 CoroutineScope 인터페이스를 확인해보자.보다시피 CoroutineContext를 가지고 있는 걸 볼 수 있다. 그리고 다시 한 번 CoroutineContext가 무엇인지 들어가보자.문서 최상단을 읽어보면 CoroutineContext는 여러 Context Element를 포함하고 있다는 사실을 알 수 있다. 여기서 가장 중요한 Element에는 바로 Dispatcher, Job, ExceptionHandler, Nam..

Language/Kotlin

Coroutines on Main Thread(위험성에 대해 인지하기)

오늘은 코루틴을 메인 스레드에서 실행해보고 그 결과에 대해 생각해보는 시간을 가져보았다. 어떤 작업을 시킬까이번에는 단순한 연산을 시킬 예정이다. 아주 많이 팩토리얼(Factorial) 계산을 시켜보겠다. 코드를 보자.fun calculateFactorial(number: Int): BigInteger { var factorial = BigInteger.ONE for (i in 1 .. number) { factorial = factorial.multiply(BigInteger.valueOf(i.toLong())) } return factorial}여기서 BigInteger를 사용했는데 간단히 말하면Integer형으로 계산할 때 오버플로우가 날만한 범위까지도 계산이 가능한 클래스이..

Android

Android Material Library Update Story(feat. BottomNavigationView)

글 작성 배경이 글을 적게 된 배경은 뭘까? 나는 시간이 어느 정도 지난 개인 프로젝트를 오랜만에 다시 만지고 있었다. 이 때, Material 라이브러리 버전과 targetSdk 버전을 동시에 올리면서BottomNavigationView 배경 색상이 내가 사용하지 않는 기본 색상으로 적용이 되었다. 샘플 앱을 대충 만들면 나오는 그 보라색 말이다. 나는 Material 라이브러리의 Color system을 사용하고 있었는데도 이런 현상이 발생했다. 문제 지점 찾기분명 라이브러리에서 BottomNavigationView의 background color를 정의하는 부분이 있을 것이라 생각했다. 그럼 라이브러리에서 어떤 color를 사용할까? 바로 Material 공식 사이트에서 확인할 수 있었다. 스크린샷..

Android

Android Library Manifest Attributes Replace

필요해진 배경이번 기능은 왜 필요했을까? QR코드 스캐너 라이브러리를 사용하는데 알고보니 화면 방향이 가로 고정이었다. 하지만, 내가 필요로 하는 화면 방향은 세로 고정이었다. 해결 방법내가 사용했던 라이브러리를 예시로 보여주겠다. https://github.com/journeyapps/zxing-android-embedded GitHub - journeyapps/zxing-android-embedded: Barcode scanner library for Android, based on the ZXing decoderBarcode scanner library for Android, based on the ZXing decoder - journeyapps/zxing-android-embeddedgithub..

Android

Android Talkback Ordinal Number(ScreenReader 서수 읽기)

이번 기능은 상당히 어이없는 해결책을 가져왔다.(그런걸 왜 가져왔냐..?고 하면 할 말은 없다 ㅋㅋㅋ😂) 문제의 시작요구사항은 이렇다. RecyclerView 각 아이템에 포커스를 주면 해당 아이템이 총 몇 개 중 몇번 째인지 읽어주는 것이었다. 정말 간단한 기능이다. 나는 onBindViewHolder에서 setContentDescription을 통해 해당 문자열을 설정해주었다. 그런데 스크린리더가 읽는 텍스트는 약간 달랐다.예를 들면, 총 10개 중 일번 째라고 읽는 것이 아니겠는가? 이상한 점을 찾았을 지 모르겠다. 첫번째, 두번째, 세번째가 아닌 일번 째, 이번 째, 삼번 째와 같은 형식으로 읽어버리는 것이었다. 문제 발생 지점나는 나름 수동으로 문자열 리터럴을 만들어 설정해주었는데 여기서 정말..

BonusTrack02.dev
'안드로이드' 태그의 글 목록