안드로이드 앱을 사용하다보면, 다음과 같은 UI를 만날 때가 있다. 해당 UI를 FlowLayout과 Chip을 이용하여 구현해보겠다. 관련 학습은 아래의 구글 공식문서를 참고하여 만들었다. https://developer.android.com/jetpack/compose/layouts/flow Flow layouts in Compose | Jetpack Compose | Android Developers Flow layouts in Compose Stay organized with collections Save and categorize content based on your preferences. Beta: FlowRow and FlowColumn are experimental. This docume..
1. 현재 시간보다 이전으로 알람을 설정하면 바로 울림 당연한 사실일 수도 있겠지만 현재 시간보다 이전으로 알람 시간을 설정하게 되면, 설정 즉시 알람이 울리게 된다. 만약에 현재 시간 이후에 알람을 실행하려고 했던 의도라면, 다음과 같이 코드를 작성해서 하루를 더해주면 된다. if(calendar.before(java.util.Calendar.getInstance())) { calendar.add(java.util.Calendar.DAY_OF_MONTH,1) } 2. 반복적인 알람을 만들고 싶은데 정확한 시간을 설정하고 싶다면 API 33 이전 버전에서는 setRepeat()를 통해 정확한 시간에도 알람이 잘 작동했었다. 하지만 33버전에서는 정확한 시간을 반복을 할 수 없었다. 해당 이유는 13부터 ..
Interceptor Http의 요청과 응답 처리 중간에 개입하여 요청 또는 응답을 수정하거나 로깅하는데 사용된다. 대표적으로 요청에 헤더를 추가하거나, 응답을 로깅하거나, 인증토큰을 추가하는 데 사용된다. 사용방법 addInterceptor() 메서드를 사용하여 객체를 추가해야 한다. 예를 들어 헤더를 추가하는 작업을 진행한다면, 다음과정을 따른다. Interceptor 작성 및 적용 OkHttpClient를 생성하고 Interceptor를 추가 Retrofit에 OkHttpClient를 설정한다. import okhttp3.Interceptor import okhttp3.OkHttpClient import retrofit2.Retrofit import retrofit2.converter.gson.Gs..
버전에 따라 다른 사진 저장 방식 문제 상황 생성된 조언을 갤러리에 저장하는 과정에서, 안드로이드 버전에 따라 다르게 구현해야 하는 문제에 직면했다. 에뮬레이터는 Q 버전 이 후를 사용했기 때문에 MediaStore를 이용하여 개발을 하였다. 하지만, 테스트용 기기는 Q 버전 이전이라 실제로 저장이 안되는 문제가 발생하였다. 해결 방법 *Q버전 이전과 이후를 분리한다. 실행되는 기기의 버전을 확인하는 방법은 Build.VERSION.SDK_INT 로 확인이 가능하다. if 문을 통해 버전을 체크한다. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) 파일 이름 타임 스탬프를 사용하여 중복을 방지한다. 파일 식별자에서는 이름이 곧 고유 식별자이므로, 이름이 동일하..
본 게시글은 '헤드퍼스트-디자인 패턴 (개정판)'을 기준으로 작성된 글입니다. 문제점 찾아보기 Duck duck; if (picnic) { duck = new MallardDuck(); } else if (hunting){ duck = new DecoyDuck(); } else if (inBathTub) { duck = new RubberDuck(); } 다음 코드에서의 문제점은, 각 조건에 따라 다른 Duck이 생성이 된다. 만약 새로운 Duck을 추가하기 위해 확장한다면, 어떤 것을 추가하고 삭제해야할 지 코드를 다시 확인해야 한다. 결론 Concrete Class(구상 클래스)를 많이 사용하면, 새로운 구상 클래스가 추가될 때마다 코드를 고쳐야하므로 많은 문제가 생길 수 있다. 결국 변화에 닫혀 있..
await()를 사용하려는 데 안되는 경우가 있다. build.gradle에 다음을 추가해주면 해결! implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.1"