본문 바로가기

Android

(16)
[Android] ViewModel(with Hilt) init 함수 동작 문제 ViewModel의 init 함수에 동작을 설정하고 Activity에서 호출하여 작동을 확인하고 있었다.의도한 동작을 하지 않아 로그를 찍어보니 init 함수가 동작을 하지 않는 문제를 확인했다. @AndroidEntryPointclass MainActivity : ComponentActivity() { private val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { SomethingComposable { Butto..
[Android] Compose - Hidden Button이 있는 Button 만들기 드래그를 하여 숨겨진 버튼이 나타나도록 하는 Composable 함수를 만들어 보려고 한다. 위와 같이 Box Composable을 하나 주고 Child로 Button들을 배치할 Row,그 위에 Drag에 의해 사이즈를 조정할 Box를 하나 배치하려고 한다. Drag를 통하여 초록 Box의 사이즈를 바꾸는 것으로 뒤에 배치된 Button들이 보이도록 하는 것이 목표이다. 먼저, 위 연산을 진행하려면 각 크기를 알아야 하므로 다음과 같이 작성했다.@Composablefun FolderButton( hiddenButtons: @Composable RowScope.() -> Unit,) { var hiddenButtonGroupWidth by remember { mutableIntStateOf(0)..
[Android] 흔드는 Gesture를 탐지해보자. Network graph 시각화를 위한 뷰를 만드는 중에노드에 사용자 interaction 처리에 대해 추가하고 싶은 것이 생겼다.바로 흔드는 제스쳐이다. 노드를 잡고 흔들었을 때 액션을 주고 싶은 상황이다. 구글에 shake를 키워드로 검색하면 디바이스 자체를 흔드는 결과가 많이 나오고원하는 결과를 찾기 힘들어 직접 만들어 보기로 했다. 먼저 "노드를 잡고 흔든다"의 정의를 내려야 겠다. 1. 흔드는 과정의 모션이벤트들은 기준이 되는 노드 주변에 특정 거리내에 존재해야 한다. 2. 흔드는 과정의 모션이벤트들은 기준이 되는 노드를 기준으로 반대편을 반복하는 시퀀스를 가져야 한다. 3. 흔드는 과정의 모션이벤트들의 속도는 일정 이상이어야 한다.  위 3가지 조건을 만족하도록 작성해보자.일단 흔드는 모션이벤..
[Android] Paging3 - infinite scroll Retrofit API 통신을 통해 데이터를 가져와 RecyclerView에 데이터를 노출하는 작업을 하면 무한 스크롤을 구현해야 하는 경우가 있다. 구현방법은 크게 2가지가 있는 듯하다. 첫 번째로는 API에서 가져온 데이터를 RecyclerView Adapter에 반복적으로 삽입해 주는 방법으로RecyclerView의 스크롤이 하단에 도달하게 되면 다음 페이지의 API 호출을 하는 방법이다. 오늘 살펴볼 방법은 두번째 방법인 Paging을 사용하는 것이다.시작하기에 앞서 앱수준 Gradle에 paging 라이브러리를 추가하자.implementation("androidx.paging:paging-runtime:3.3.0") 사용할 API는 kakao daum search api로 dto는 다음과 같다...
[Android] DataStore 안드로이드 개발자 페이지 DataStore를 참고하였다. 앱 아키텍처: 데이터 영역 - Datastore - Android 개발자 | Android Developers 데이터 영역 라이브러리에 관한 이 앱 아키텍처 가이드를 통해 Preferences DataStore 및 Proto DataStore, 설정 등을 알아보세요. developer.android.com Room 보다는 가볍게 사용할 수 있는 내부 저장소 DataStore를 구성해보려고 한다. 기존에 SharedPreference의 대체재로서 등장한 녀석이다. DataStore는 Preferences DataStore, Proto DataStore 두 가지로 나누어 설명되고 있다. 둘의 차이는 Type Safety의 유무되시겠다. 먼저 Type ..
[Android] Expandable TextView Expandable TextView를 만들어보려고 한다. 깃허브에 한 프로젝트를 참고하여 만들었다. GitHub - TheCodeYard/EllipsizedTextView: A simple TextView with a simple task: support custom ellipsis. A simple TextView with a simple task: support custom ellipsis. - TheCodeYard/EllipsizedTextView github.com 기본적으로 TextView에 clickListener를 주어 접거나 피는 행위를 할 예정이다. 그리고 기존 "..." 으로 설정된 ellipsis를 "... more"로 변경하려고 한다. 아주 가벼운 마음으로 시작한 일이었지만 예상 외..
[Android] Custom View를 만들어보자 위와 같이 인스타그램에서 사용하는 모양의 이미지뷰 클래스를 만들어 보려고 한다. 안드로이드에서 제공하는 뷰들을 적절히 조합해서 만들어 보자. 먼저 Layout에 CardView를 배치하고 layout길이의 절반에 해당하는 radius를 주면 원 형태를 만들 수 있다. CardView에 Gradient Color의 xml을 background로 하는 layout을 배치하고 원형 CardView를 배치하고 내부에 ImageView를 scaleType: centerCrop하여 배치해 주면 완성되시겠다. 먼저, View를 상속받은 클래스를 만들면 총 4개의 contructor를 마주치게 된다. View Class를 들어가 주석을 읽어보자. Context만을 파라미터로 하는 constructor는 코드에서 뷰를 ..
[Android] Composable과 suspend의 유사성 코트린 suspend method는 suspend method 안에서 부를 수 있다. 이는 코틀린 코드를 자바 코드로 바꾸어 보면 이유를 유추해 볼 수 있다. suspend fun a() { b() } suspend fun b() { } 위 코드를 자바 코드로 바꾸어 보면 @Nullable public static final Object a(@NotNull Continuation $completion) { Object var10000 = b($completion); return var10000 == IntrinsicsKt.getCOROUTINE_SUSPENDED() ? var10000 : Unit.INSTANCE; } @Nullable public static final Object b(@NotNull ..