본문 바로가기

안드로이드

(5)
8월 한달 토이 프로젝트를 해보자! -06 : AppBar 이제 툴바를 추가해줄 차례다. ListFragment와 DetailFragment가 사용할 툴바의 기능 및 아이콘 갯수가 다른 만큼, 액티비티에 기본적으로 배치를 하되 각 Fragment에 진입할 때 메뉴의 수정이 필요할 것이다. 우선 resource에 menu를 추가해준다. (리소스 추가하는 방식과 동일하게, menu로 만들겠다고 선택하면 디렉토리는 알아서 설정해준다.) 리스트 메뉴와 디테일 메뉴를 각각 만들었다. list_menu.xml 공식문서에서 setHasOptionsMenu(true)를 설정해주래서 해줬더니 Deprecated 되었다고 뜬다! 아니 공식아!!! 검색을 해보니, 2021.9월에 배포된 Jetpack Version 1.4.0-alpha01에 해당 언급이 있다. 링크는 아래에. ht..
8월 한달 토이 프로젝트를 해보자! -05 : Adapter Click 리스트 ui까지 만들어짐을 확인했으니, 이제 다시 디테일 페이지로 진입하는 부분을 건드릴 차례다. 이때, 클릭 이벤트 생성에 앞서, 디테일 페이지에서는 해당 포스트의 주인, 즉 다이어리를 쓴 본인일 경우 수정이 가능해야 할 것이며, 댓글 작성/삭제 역시 가능해야 할 것이다. 이를 위해서는 디테일 페이지 접속자가 포스트 작성인인가 댓글 작업을 하려는 포스트의 고유값이 무엇인가 위에 대한 최소한의 처리가 필요하다. 이를 위하여 Diary 모델에 val id: String과 val account: String 두 가지 속성을 추가해주었다. account는 로그인 한 계정정보와 비교할 것이고, id는 포스트 등록시 UUID를 생성하여 부여, 댓글 등을 이와 매칭시켜 추후에 조회, 불러올 것이다. 이제 본격적으로..
8월 한달 토이 프로젝트를 해보자! -04 : List UI 다음은 리스트 ui 구성이다. 내가 생각한 구성은 GridLayout을 활용, 한 줄에 CardView를 2개씩 배치하고, 각각의 CardView 안에는 사진, 제목, 최종 업데이트 날짜, 좋아요 수, 댓글 수를 배치할 것이다. list_fragment.xml에는 우선 RecyclerView만 배치하고, CardView 내부의 레이아웃을 짜야 한다고 생각, Adapter를 만들기로 하였다. 써놓고 보니 Glide와 Paging 라이브러리를 써야겠다, 는 생각이 든다. 아무튼 그건 다음에 기능/성능 파트에서 고민하기로 하고. 우선 list_fragment 및 ListFragment에서 tmpCardView를 없애준다. Adapter로 대체할 부분이니까. 그 다음 RecyclerView를 배치해줄 건데, 이..
Retrofit - MVVM - Coroutine ㄲㄲㄲ 그렇다. async에 아주 많이 애를 먹었다. 어째서 두 개의 fun을 리스트로 묶어 awaitAll()을 실행했는데 자꾸 하나를 기다리지 않고 다음 fun을 진행해버리는가?! 일단 이 문제는 잠시 뒤로 미루고 프로세스가 진행될 수 있게, 두 fun을 각기 다른 fun 안에서 async 처리해주었다. 속성으로 공부해서 실무에 적용하려니 정말 힘들다 힘들어, 나는 설명을 해줘야 하고 나에게 설명해줄 사람은 없고! 1년차에 이래도 되는 겁니까 이거!!! 일단 이전에 url 앞부분 (Shop, Field, ...)에 따라 apiCall을 나눠놓는 것은 굉장히 비효율적이라는 결론을 내리고 하나의 인터페이스에 모두 몰아넣기로 하였다. ApiCall.kt interface ApiCall { @POST("/Login..
Retrofit! Eureka! Fragment랑 같이 쓰려다가 MainFragment 예시 때문에 글이 너무 길어져서. 우선 response가 제대로 돌아오지 않던 이유를 찾았다. Retrofit이 Gson을 디폴트로 사용하기 때문에, 내가 Body로 전송하는 인스턴스가 Json으로 자동으로 serialized 되었기 때문. 즉, 이미 serialized 된 JSONObject를 한 번 더 toJson() 시켜주는 삽질을 하고 있던 거다. 하여, 다시 만든 인터페이스. LogInApi.kt interface LogInApi { @POST("/Login") fun startLogin(@Body jsonObj: Operator) : Call companion object { fun create() : ApiInterface { val r..