Development

Dialog에서 기존 XML 기반 View에 ComposeView를 병합하는 작업을 진행하던 중에 아래와 같은 오류를 마주쳤습니다.java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from android.widget.FrameLayout{854b4dc V.E...... ......I. 0,0-0,0 #7f0a0897 app:id/rootLy} at androidx.compose.ui.platform.WindowRecomposer_androidKt.createLifecycleAwareWindowRecomposer(WindowRecomposer.android.kt:352) at androidx.compose.ui.platform.Window..
안드로이드에서 Balloon 툴팁 구현하실 때, 아마 알고 계신 분들도 많겠지만 해당 라이브러리를 사용하는 경우가 많습니다.https://github.com/skydoves/Balloon GitHub - skydoves/Balloon: :balloon: Modernized and sophisticated tooltips, fully customizable with an arrow and animations for:balloon: Modernized and sophisticated tooltips, fully customizable with an arrow and animations for Android. - skydoves/Balloongithub.com 기존 View 방식이나 Compose 방식을 모두..
안드로이드에서 mp4 형식의 사용 방법 가이드 영상 파일을 넣어야 하는 작업이 생겼습니다.새로운 화면을 만드는 겸 Compose를 기반으로 mp4 영상을 넣어봤네요. ExoPlayer라는 오픈 소스 미디어 플레이어 라이브러리를 활용했습니다.https://developer.android.com/media/media3/exoplayer/hello-world?hl=ko 시작하기  |  Android media  |  Android Developers이 페이지는 Cloud Translation API를 통해 번역되었습니다. 시작하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 도움말: 시작하는 또 다른 방법은 ExoPlayer Codedeveloper.android.com 먼저..
소수점 반올림 처리 표시에 사용되는 DecimalFormat import java.text.DecimalFormat import java.math.RoundingMode fun main() { val a = 13 val b = 0.165 val decimalFormat = DecimalFormat("0.000000") // 소수점 아래 6자리까지, 부족한 부분은 0으로 채움 decimalFormat.roundingMode = RoundingMode.DOWN val res = decimalFormat.format(a * b) println("FormatDouble -> $res") // 출력: "FormatDouble -> 2.145000" } (#는 해당 위치에 숫자가 없으면 아무것도 표시하지 않지만, ..
데이터 필터링 작업을 하던 중에 조금 특수한 케이스를 처리해야 하는 상황이 생겨 몇 가지 컬렉션 함수를 실무에서 사용했습니다. 어떤 boolean 값으로 구분이 가능한 데이터 리스트가 존재하고, 이 중 false인 부분을 다시 특정 날짜값에 의해 그룹화하여 어떤 필드의 최대 값을 가지고 있는 요소만 살리도록 하는.. 그런 로직이 필요했습니다. 일단 먼저 boolean 값 구분을 위해 partition 함수를 사용했습니다. 명시한 조건에 따라 리스트를 분리해 줍니다. 저는 true/false 조건이기 때문에 변수 2가지로 리스트를 구분할 수 있었습니다. val (fineDatas, nonFineDatas) = allDatas.partition { it.isFine() } 다음으로 nonFineDatas를 ..
안드로이드의 Toast는 기본적으로 텍스트 메시지를 위한 것이며, 사용자 인터랙션(예: 버튼 클릭)을 직접 처리하는 기능을 내장하고 있지 않습니다. 따라서 커스텀 Toast로 버튼을 삽입한다고 하더라도 onClick에 대한 처리가 불가능합니다. 그래도 Toast에 Clickable을 추가하고 싶다면? Custom Dialog를 활용하여 어느 정도 비~슷하게 구현이 가능합니다. 우선 위와 같은 형태로 Custom Dialog 레이아웃 XML 파일을 구성했습니다. 그다음, ClickableToast라는 이름으로 Custom Dialog를 생성합니다. class ClickableToast(private val context: Context, private val text: String) : Dialog(con..
Fatal Exception: java.lang.IllegalArgumentException RemoteViews for widget update exceeds maximum bitmap memory usage (used: 16216160, max: 15940800) 위와 같은 에러가 간혹 Widget에서 Bitmap을 사용할 때 발생합니다. 이전에 관련된 글을 작성했으나 여전히 재발하는 경우가 있어서 더 강화된 로직을 문서를 참고하여 구성했습니다. 거대한 비트맵 처리에 대해서 아래 공식 문서에서 처리 로직을 제안해주고 있습니다. https://developer.android.com/topic/performance/graphics/load-bitmap?hl=ko 큰 비트맵을 효율적으로 로드 | App q..
중국에서는 구글 플레이 스토어가 지원되지 않는다. 중국에서 발매된 안드로이드 디바이스는 구글 플레이 스토어를 사용할 수 없습니다. 이유는 구글이 중국 정부의 검열 문제 때문에 아예 철수를 해버리게 되면서 모든 구글 서비스가 중단되었기 때문입니다. 하지만 바이두로 앱을 전파하는 경우도 있습니다. 이때, 구글 플레이 스토어가 지원되지 않을 경우, Billing 기능을 고려하여 구글 플레이 서비스 사용 가능 여부 확인이 필요한 경우가 있었습니다. 어떻게 해야 그 여부를 확인할 수 있는지 설명하겠습니다. GoogleApiAvailability GoogleApiAvailability 클래스는 Google Play 서비스의 가용성을 확인하고, 필요한 경우 사용자에게 오류를 해결하도록 안내하는 데 사용됩니다. 이 클..
지겹도록 사용하던 Kotlin Extensions를 모두 걷어내고, 기존 XML 기반 프로젝트에 코틀린 버전을 업그레이드하여 Compose를 도입하게 되었습니다! 이번에는 XML 기반 프로젝트에서 중간에 Compose를 끼워 넣는 과정을 설명드리고자 합니다. 코틀린 & Compose 버전 업데이트 제 프로젝트는 코틀린 버전 1.8.0으로 설정되어 있어 해당 버전과 호환이 가능한 Compose 버전 확인이 필요했습니다. 아래 주소에서 각 코틀린 버전에 대한 컴포즈 버전 확인이 가능합니다. 만일 리스트에 없는 버전이라면 코틀린 버전에 대한 업그레이드가 선행되어야 하겠습니다. (만일 1.7.22 코틀린 버전이라면 1.4.0 컴포즈 활용이 가능한 1.8.0 코틀린 버전으로 마이그레이션 해주세요.) https:/..
안드로이드 코틀린 - ViewBinding을 Adapter에 적용하기 Android에서 ViewHolder 기반으로 ViewBinding을 적용할 수 있습니다. inner class ViewHolder(val binding: ItemReviewBinding) : RecyclerView.ViewHolder(binding.root) { init { //TODO: Init UI } } ViewHolder에 직접 Binding 처리를 진행합니다. override fun onCreateViewHolder(parent: ViewGroup, position: Int) = ViewHolder(ItemReviewBinding.inflate(LayoutInflater.from(parent.context), parent, ..
SeungYong.Lee
'Development' 카테고리의 글 목록