본문 바로가기

분류 전체보기

(76)
[Android] Clickable RecyclerView StickyHeader 들어가는 글 RecyclerView.ItemDecoration의 onDrawOver를 응용해 StickyHeader를 구현하는 방법은 헤더의 버튼들이 동작하지 않습니다. 요구사항을 맞추기 위해 실제 헤더 View를 추가하는 방식으로 StickyHeader를 구현해봤습니다. 아래 포스트를 참고하여 개발했습니다.https://medium.com/@preethamivan473/sticky-headers-with-click-interactions-using-android-recycler-view-40e583a31605 Sticky Headers with click interactions using Android Recycler ViewSeveral times, we need to implement a stick..
[Android] Lifecycle-aware BroadcastReceiver 구현하기 import android.content.BroadcastReceiverimport android.content.IntentFilterimport androidx.activity.ComponentActivityimport androidx.core.app.ActivityCompatimport androidx.core.content.ContextCompatimport androidx.lifecycle.Lifecycleimport androidx.lifecycle.LifecycleOwnerimport androidx.lifecycle.lifecycleScopeimport androidx.lifecycle.repeatOnLifecycleimport kotlinx.coroutines.awaitCancellatio..
[Android] View에서 by viewModels() 사용하기 ❗주의이 Extension은 Hilt DI 라이브러리 사용과 Activity 또는 Fragment에 @AndroidEntryPoint 어노테이션이 선언되어 있는 경우 유용하게 사용 가능합니다.import android.app.Activityimport android.content.Contextimport android.content.ContextWrapperimport android.view.Viewimport androidx.activity.ComponentActivityimport androidx.annotation.MainThreadimport androidx.lifecycle.HasDefaultViewModelProviderFactoryimport androidx.lifecycle.ViewMode..
[Android] FlexboxLayout 초과된 줄 숨김 처리 Extension FlexboxLayout가 몇 줄을 넘어가는 경우 더보기 / 숨김 기능을 구현하는 과정에서 만든 Extension입니다.import androidx.core.view.childrenimport androidx.core.view.isVisibleimport com.google.android.flexbox.FlexboxLayoutval FlexboxLayout.lineCount: Int get() = flexLines.sizefun FlexboxLayout.hideOverLines(criteria: Int) { if (lineCount > criteria) { for (i in criteria until lineCount) { val flexLine = flexLi..
[Android] Jetpack Compose Radar Chart Jetpack Compose로 구현해본 Radar Chart(방사형 차트) 입니다.import androidx.compose.animation.core.Animatableimport androidx.compose.animation.core.tweenimport androidx.compose.foundation.Canvasimport androidx.compose.foundation.layout.aspectRatioimport androidx.compose.foundation.layout.fillMaxWidthimport androidx.compose.material3.MaterialThemeimport androidx.compose.runtime.Composableimport androidx.compos..
[Android] Compose Scrollable Column에서 처음 보여지는 타이밍 캐치하기 들어가는 글신규 기능으로 매출 분석을 차트, 막대 그래프 등 시각적으로 표현하는 기능을 개발하게 되었습니다.평소 토스의 인터랙션과 애니메이션에 관심이 많았기에 소비 분석 화면을 참고해보기로 했습니다.소비 분석엔 카테고리별 소비, 일별 소비, 월별 소비, 고정 지출 등 다양한 분석이 Column에 나열되어 있습니다.막대그래프의 높이 애니메이션, 원그래프의 애니메이션은 Column을 스크롤해 화면에 표시되는 순간 시작하게 됩니다.토스처럼 Scrollable Column에서 화면에 보여졌을 때 애니메이션이 시작되길 원했습니다.처음에는 LazyColumn을 사용해봤지만 하단을 갔다가 상단을 갔을 때 애니메이션이 다시 시작되는 문제가 있었고, debug 환경에서 프레임이 떨어지는 현상도 있어 일반 Column을 ..
[Android] Fragment.rootFragment extension property val Fragment.rootFragment: Fragment get() = parentFragment?.rootFragment ?: this Fragment가 여러 개 쌓여있는 상황일 때 가장 최상단 Fragment를 반환한다. 재귀방식으로 구현해 봤으며, RootFragment 레벨에서 ViewModel 공유가 필요할 때 사용할 수 있다. class TestFragment: Fragment() { private val testViewModel: TestViewModel by viewModels(ownerProducer = { rootFragment }) } fun Fragment.findRootFragment(predicate: (Fragment) -> Boolean): Fragment { retu..
[Android] Compose Flow.collectAsState() 파악하기 Compose에서 Flow를 State로 변환할 때 collectAsState()를 사용한다. Compose Extension 들의 구현을 알면 Compose에 대한 이해도도 키울 수 있을 것 같아 파악해보려 한다. fun Flow.collectAsState(): State @Composable fun Flow.collectAsState( initial: R, context: CoroutineContext = EmptyCoroutineContext ): State = produceState(initial, this, context) { if (context == EmptyCoroutineContext) { collect { value = it } } else withContext(context) { co..