목록안드로이드/안드로이드 개발 (64)
우찬쓰 개발블로그
CardView안에 RecyclerView를 넣은 레이아웃 구조의 형태에서 CardView에만 클릭이벤트를 넣었는데도 RecyclerView의 아이템의 해당하는 영역에 클릭을하면 CardView에서 클릭이벤트가 발생하지 않는다. 적당한 xml 옵션이 없는거 같아서 (clickable, focusable 만으로는 해결이 안되는거 같음,,) 그냥 RecyclerView의 상위 ViewGroup을 하나 만들고 이 ViewGroup에서 TouchEvent를 인터셉트 하는게 빠른거 같았다. 기본적으로 터치 이벤트는 아래의 플로우로 하위 뷰까지 전달된다.클릭이벤트도 결국 아래 플로우를 응용한 구조이기 때문에 중간에 onInterceptTouchEvent를 true로 주면 그 아래까지 터치 이벤트가 전달이 되지 않기..
Pull Request 에 Sonar 를 붙여서 새로운 코드의 Test Coverage가 60%가 넘지않으면 fail이 뜨도록 하는 Sonar 설정을 깃헙에 붙여서 쓰고있었다. 잘 쓰고 있던 와중에, 이상한 현상이 하나 발견되었는데, 내 로컬에서는 분명이 문제없게 돌아가는 테스트코드가 Pull Request Sonar를 깃 액션으로 돌리면, 특정 테스트코드의 ViewModel 생성부에 constructor에 Repository하나를 넣지않았다고 계속 컴파일 에러를 뱉는 것이었다. 그래서 pullRequest.yml에 빌드옵션도 넣어보고 캐시도 날려보고 별짓을 다했다. 거쳤던 사고회로 1. 깃 러너캐시가 꼬였나? 2. 내 로컬의 캐시가 꼬여서 안되야할 코드가 돌아갔나?(? 사실 돌아보면 말도안됨) 3. 소..
1년에 한번 정도씩 까먹을때쯤 관련 이슈가 일어나서 그냥 정리해두기로.. LaunchMode Standard (default) - 항상 새로 생성. [push A] A [push B] A - B [push A] A - B - A [push A] A - B - A - A SingleTop - 최상단에 이미 그 Activity가 있을경우 그대로 사용. - 새로 호출시 onCreate 대신 onNewIntent가 호출됨. [push A] #SingleTop A [push B] A - B [push A] #SingleTop A - B - A [push A] #SingleTop A - B - A SingleTask - 같은 taskAffinity의 어떠한 Task stack 내에 이미 그 Activity를 가지고..
ViewModel의 테스트 코드를 짜다가 ViewModel.launch에 delay가 있을경우, 시간차 문제로 테스트 코드가 도달하지 못하는 문제를 마주했다. advanceUntilIdle() 를 사용하면 해결될줄 알았건만 애석하게도 테스트코드는 계속 delay()의 다음으로 도달하지 못했다. 곰곰히 생각해보니 결국 Coroutine의 Context 와 관련된 문제일것 같아서 내 코드를 훑어보니, 아무생각없이 @Before에 넣어둔 아래 코드가 문제였다. Dispatchers.setMain(Dispatchers.Unconfined) StandardTestDispatcher() 로 교체 Dispatchers.setMain(StandardTestDispatcher()) 이후 advanceUntilIdle()..
TV보면서 코드짜다가 이것때문에 3시간을 날렸다.. 진짜 멍청하게도 이것때문에 Chat GPT한테까지 물고 늘어지고 있었다.. 해답은 굉장히 가까운 곳에 있었다. 문제는 webViewClient를 세팅 하기전에 loadUrl()을 했던것.. (내가 왜 이런짓을..) 어쨋든 문제는 해결했다 어휴..
최근에 디자인팀으로 부터 받은 디자인에 다음과 같은 요구사항이 들어왔다. 1. Thumb를 움직이면 부드럽게 움직일것 2. Progress에 해당하는 부분을 터치하면 Thumb가 해당부분까지 부드럽게 애니메이션 되어서 갈것 3. Progress에 해당하지 않는 어중간한 곳에 Thumb를 놓으면, 가까운 Progress까지 부드럽게 이동할것. Android 기본으로 제공되는 SeekBar로는 구현되기 어려운 동작들이라서 잔머리 쓰지않고 직접 구현해보기로 했다. View를 상속받아서 처음부터 끝까지 모든 동작을 직접 구현했다. 재미있게도 예전에 libGDX로 개인적으로 게임 만들었던게 도움이 많이 되었다. (역시 개발경험은 버릴게없다.) 무튼 최종적으로 구현된 모습은 다음과 같다. 만드는데 재미있었던건 함정..
너무 가끔찾다보니 자꾸 잊어먹어서 저장용..
View에 대한 하나의 애니메이션이 끝나고 다음 애니메이션, 그 다음 애니메이션.. 몇개를 연달아 호출하는 요구사항이 있었다. 공식 안드로이드 라이브러리를 찾다보니.. Listener를 각각 다는 방법 말고는 없는것 같아서 편의성 클래스를 하나 만들었다. (못찾은 걸수도..) https://gist.github.com/WoochanLee/934893722316a120f9955e4fd637dc4a Android Animation Chain Android Animation Chain. GitHub Gist: instantly share code, notes, and snippets. gist.github.com AnimationChain.kt 사용 방법 val animationChain = Animation..
안드로이드 웹뷰에서 특정 Web element가 존재하느냐에 따라서 다른 처리가 하고 싶은 경우가 있을 수 있다. 그럴경우 다음과 같은 방법을 써보자. webView.evaluateJavascript("(function() { var element = document.getElementById('desireId'); return element.innerHTML; })();") { html -> val isElementExist = !(html.equals("null") || html.equals("undefined")) if (isElementExist) { ... } else { ... } } 출처 : https://stackoverflow.com/a/51509696/9797457
현재 개발하고 있는 토이 프로젝트에 RxJava는 쓰지않는데 EventBus기능이 필요해졌다. LocalBroadcastManager를 쓸수도 있겠지만, 이 클래스는 context를 필요로 하다보니 코드의 양이 늘어나는 문제도 있고, 현재 프로젝트의 아키텍쳐 구조를 헤칠것 같았다. 그래서 Coroutine에 있는 SharedFlow를 이용하여 EventBus를 구현해보기로 했다. 유저가 글쓰기를 하고나면, 다른 화면에서 이벤트를 받아서 리프레시 해주어야 한다. Coroutine 공식 문서를 보면 EventBus에 대한 가이드를 어느정도 해주고 있다. kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-sh..