RallyDestinations 이번 코드랩에서 배울 내용 Basics of using Jetpack Navigation with Jetpack Compose Navigating between composables Integrating a custom tab bar composable into your navigation hierarchy Navigating with arguments Navigating using deep links Testing navigation 샘플 프로젝트는 네비게이션이 되고 있지만, 사실 컴포즈 네비게이션을 사용한 구현이 아니다. 이를 컴포즈 네비게이션으로 구현해보자. Migrating to Compose Navigation 점진적으로 마이그레이션을 해보자! 의존성 추가 해주기..
AdvancedStateAndSideEffectsCodelab 1. 어떤 내용을 배울까? Introduction 젯팩 컴포즈의 State 와 Side Effects 에 대한 고급 개념을 실습해봤다. 로직이 사소하지 않은 stateful 한 컴포저블의 state holder 를 만드는 방법을 다룬다. 컴포즈 코드에서 코루틴과 suspend 함수를 사용하는 방법과 어떻게 다양한 유즈케이스를 위해 side effects 를 트리거하는지 알아 보았다. 미완성된 프로젝트 하나를 통해 점차적으로 개선하면서 완성하여 아래와 같은 앱을 완성하려고한다. 참고로 코드랩에 기본적인 테스트 코드가 작성되어 있기 때문에, 코드랩 중간 중간 테스트를 돌려보면서 잘 돌아가나 보도록 하자. (시간 나면 해보기) Displaying ..
커스텀 테마를 사용하는 방법을 알아보자. 커스텀 테마 사용하기 먼저 JetnewsTheme 라는 이름으로 테마를 사용할 것이므로 테마를 아래와 같이 정의 해준다. @Composable fun JetnewsTheme(content: @Composable () -> Unit) { MaterialTheme(content = content) } MaterialTheme 를 단순 감싸고 있으며, 이후에 MaterialTheme 의 생성자 옵셔널한 파라미터를 전달하면서 테마를 커스텀하는 방식으로 사용할 수 있다. @Composable fun Home() { val featured = remember { PostRepo.getFeaturedPost() } val posts = remember { PostRepo.ge..
[Android] Retrofit HTTP Converter 결과값 파싱이 null 로 올 때 ☠️ 안드로이드 앱 에서 Retrofit 을 통해 HTTP 통신(POST)을 했을 때, 일부 값이 응답에는 제대로 온 것을 확인 하였으나, Converter.Factory() 를 통과하면 null 로 값이 떨어지는 이슈가 있어서 삽질을 좀 하였다..(원인은 정말 어이가 없었다는 결말) debug 상황 재현 interface MyService { /** * # 거래 id 생성 for 등록 */ @POST("/MyService") suspend fun postMyService(@Body body: MyServiceParams): MyServiceModel? } 회사 프로젝트 코드를 그대로 가져올 수는 없으니 해당 ..
[Android] 해상도별 drawable 이미지 리소스 추가하기 (hdpi, mdipi, xhdpi, xxdpi, xxxdpi) 안드로이드 개발 시, 이미지 (png 등) 리소스를 추가할 때, 여러 해상도에서 깨지지 않는 화질의 이미지를 표현하고자 할 때 dpi 별 이미지를 추가하는 방법을 알아보겠습니다. hdpi, mdpi, xhdpi, xxdpi 등 4개의 각각 해상도의 png 를 디자이너로 부터 제공받았고 이를 수동으로 추가하는 방법입니다. 먼저 drawable 폴더로 이동합니다. 프로젝트 네비게이션 탭에서 drawable 폴더 우클릭 후, open in finder 를 통해 해당 폴더로 바로 이동할 수 있습니다. 그럼 위와 같이 drawbla 이 존재하는 것을 볼 수 있습니다. 없으면 위와 동일..
1. 안드로이드 리사이클러뷰와 그리드 레이아웃 매니저를 이용한 해상도별 item 그리기 프로젝트를 진행하며 마주친 문제인데, 리사이클러 뷰 에서 여러 종류의 아이템(헤더, 아이템카드, 푸터)을 뿌려주고 있는 상황이며, 가이드로 나온 디자인은 특정 해상도에서 아이템 뷰를 다르게 보여주기를 원하고 있었습니다. 아래는 디자인 가이드 예시 입니다. 리사이클러 내부에 들어가는 아이템이 한 가지 종류가 아니라 위 디자인 가이드를 보시면 알겠지만 최 상단에는 타이틀 헤더(Header)가 최 하단에는 푸터(Footer)가 붙어있는 상황입니다. 기본적으로 사용하고 있었던 LinearLayoutManager 를 걷어내고 GridLayoutManager 를 사용해야 함은 얼추 알고는 있었는데, 아이템 타입이 여러개 일 때는..
오늘은 코틀린에 있는 정수 타입(형식)과 실수 타입(형식)에 대해서 알아보도록 하겠습니다. 다른 언어와 비슷한 점도 있으나 다른 점 또한 존재하므로 한 번에 설명드리도록 하겠습니다. 그럼 바로 예제 코드를 보시죠. 🧊 예제 코드 예제 코드입니다. fun main(args:Array):Unit { val a:Byte = 125 val b:Short = (100 + 200) * 100 //30000 var c:Int = 12_4354_6538 //가시성 향상 표기법 c = 0xFF_88_88 //0x는 16진수 c = 0b01010010_01100011_01110101_01000101 //0b는 2진수 //8진법은 지원x var d:Long = -543_7847_3984_7238_4723 //자동 Long ..
[Android] Listener with Interface (for TimePicker, Calendar) 이번 포스팅은 안드로이드에서 복합 위젯을 만들어 보는 예시 중에서 캘린더와, 시간선택 위젯 두 개를 합친 커스텀 위젯을 만들어보는 예시에 관련된 내용입니다. 해당 내용에서 DateTimePicker 클래스에서 OnDateTimeChangedListener 인터페이스를 정의하여 캘린더와 시간 선택에 있어서 같이 처리가 되도록 하는 내용이었는데 잘 이해가 되지 않아서 이해 될 때까지 해봤습니다. 그 내용을 기록하는 것이 글의 목적입니다. 현재 시간이나 날짜를 사용자가 변경하게 될 경우 호출되는 리스너를 정의합니다. 인자로는 뷰를 받고, 년, 월, 일, 시간, 분 을 전달 받습니다. 36라인에는 인터페..
[Android] setSupportActionBar 액션바 실행오류 뜰 경우 안드로이드에서 android.support.v7.app.AppCompatActivity를 import해서 사용할 경우에 컴파일은 되지만 실제로 기기에서 실행할 경우에 아래와 같은 런타임 오류가 발생할 수 있습니다.This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead. 위 같은 오류는 Doit안드로이드 둘째마당 SampleTab 예제를 학습하던 ..
[Android] 안드로이드스튜디오 상태저장하기 (다시킬때 복원하기) 안드로이드 독학을 시작했습니다. 자바기반이라 언어쪽으로 어려운 점은 없는데, xml구조와 안드로이드만의 특이한 기능들이 많아서 공부할게 꽤 많네요. 이번 글에서는 안드로이드어플에서 어플(엑티비티)의 생명주기를 이용해서 상태를 저장하는 방법을 알아보도록 하겠습니다. activity는 생명주기(life cycle)를 갖고있는데 간단하게 말하면 어플을 켜둔 상태에서 홈버튼을 누르면 onPause, onStop 매서드가 실행되어 해당 상태가 되고 다시 해당 어플을 키게되면 onStart, onResume 매서드가 실행되면서 해당 상태가됩니다. 그리고 취소버튼 두 번을 누르게되면 일반적으로 어플이 종료되면서 onDestroy가 호출되며 어플이 ..