본문 바로가기

분류 전체보기

(37)
[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] Fragment에서 Coroutine의 사용 Flow를 사용하여 Fragment의 View를 업데이트하게 되면Coroutine을 이용하여 해당 값을 관찰하는 코드를 작성하게 된다. 테스트를 하기 위해서 아래와 같이 작성해 주도록 하자.먼저 Activity이다.class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) with(bi..
[Android] Tensorflow Lite Model - Object Detect Tensorflow Lite를 검색해보니 여러가지 pre-trained model을 받을 수 있었다. 그래서 사이트에서 제공하는 모델과 라이브러리를 통해서 한번 사용해 보았다.https://www.tensorflow.org/lite/models/trained?hl=ko&_gl=1*1rxz61k*_up*MQ..*_ga*MTEzMTI5MjY0NC4xNzE0NjUwODE3*_ga_W0YLR4190T*MTcxNDY1MDgxNy4xLjAuMTcxNDY1MDgxNy4wLjAuMA.. TensorFlow Lite용 사전 학습된 모델TensorFlow가 5월 14일 Google I/O로 돌아왔습니다! 지금 등록하세요 이 페이지는 Cloud Translation API를 통해 번역되었습니다. TensorFlow Lite..
[Android] Configuration Change 시에 Observable과 ViewModel에 대하여 먼저 LiveData 코드를 살펴보자.object MyRepository { private val _textLiveData = MutableLiveData("") val textLiveData: LiveData = _textLiveData fun op() { _textLiveData.value = Random.nextInt(-100, 100).toString() }}class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } private val viewModel: MainViewModel by viewMode..
[Kotlin] Annotation & Annotation 처리에 관하여 Annotation을 사전에서 찾아보면 주석이다. 이 주석을 어디에 어떻게 추가하는지 알아보도록 하자. Kotlin Reflection interface의 hierarchy의 최상단은 annotatedElement 이다. 해당 인터페이스를 살펴보면 다음과 같다. 어노테이션을 기록하는 역할을 하는 것을 알 수 있다. Reflection interface의 최상단 interface가 위와 같다는 것은 reflection으로 다루던 모든 것이 annotation의 대상이 될 수 있다는 것을 알 수 있다. 아래는 코틀린 클래스의 annotation을 가져와 출력하는 예시이다. fun main() { val kClass = Playground::class kClass.annotations.forEach { ann..