Apple is Apple
article thumbnail

일일회고

 

입문 프로젝트가 시작되었다. 동시에 선발대 2주 차도 진행되어 과제가 부여되었다.

 

프로젝트 회의, 개발 , 선발대 과제 등 할 것들이 많아졌다.

 

시간분배를 잘하여 모두 큰 문제없이 해결해나 가보자!

 

이번주는 파이팅이다!


 

오늘의 키워드

  • 선발대 세션
  • 프로젝트 시작

1. 선발대 세션

Kotlin

val

  • value
  • Assign-once이라서 한 번 초기화하면 변경할 수 없음

var

  • varibale
  • Mutable이라서 언제든지 변경할 수 있음
  • 특별한 일 없으면 val을 사용

const val

  • 상수변수
  • 초기값을 변경하지 않고 그대로 사용하는 변수

val, const val은 둘 다 한 번 초기화하면 변경할 수 없는데 같은 거 아닌가요? 둘 다 초기화하면 변경할 수 없는 것 맞지만 사용하는 방법에 따라 다르다. Backing Field에 학습해 보자.

<kotlin />
private val isEnglish = true private val camp = "안녕" get() { return if (isEnglish) { "hello" } else { "안녕" } }

init

  • Class는 init 예약어로 초기화 블록을 가질 수 있음
  • Class 생성과 동시에 실행되는 영역

lateinit

  • 늦은 초기화, 초기화를 나중에 미루는 방법
  • var로 선언한 프로퍼티에만 사용 가능
  • nullable(null 허용) 프로퍼티에는 사용 불가능

 

 

RecyclerView

 

ViewPager2

adapter -> FrameStateAdapter사용, 다양한 생성자가 있는데 상황에 알맞게 사용 

추후 업데이트

 

 

++ (2023, 08. 15  00:34 추가)

선발대 2주차 과제

 

fab를 통해 todo item을 추가 할 수 액티비티로 이동할 수 있도록 함, 단 todo tab에만 fab를 활성화 하고 bookmarked에서는 비활성화

 

-->  ViewPager2의 registerOnPageChangeCallback을 통해 해결

이 메소드에 페이지가 선택 될 때의 따른 fab의 hide(), show()를 하는 콜백을 생성하여 register해줌

<kotlin />
// 콜백 private val callback by lazy { object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { when (position) { 0 -> binding.fabAddWriting.show() else -> binding.fabAddWriting.hide() } } } } // 등록 pager.registerOnPageChangeCallback(callback)

  

 

1.1. TroubleShooting

 

todo item을 추가 할 수 액티비티를 만들고 제목, 내용을 입력 받아 메인 화면에 보여줄 수 있도록함

---->

처음에 구조를 생각해봄

 

ViewPager - ViewPagerAdapter - fragment 로 연결되어있으니  todoWritingActivity ->  MainActivity -> ViewPagerAdapter -> fragment

액티비티 사이에선 extra로 viewpager, fragment에선 bundle을 이용해서 넘거주면 되겠다..라고 생각함

 

일단 구현

 

1차시도 실패 --> 모르겠어서 로그를 엄청 찍어봄

 

todoWritingActivity -> MainAcitivity로 intent 데이터는 잘 넘어오는 것을 확인함. 그래서 MainActivity -> ViewpagerAdapter로 전달하는거 확인 -->  확인해보니 null이 찍힘 -> ??? 왜지 왜 안넘어가지 --> 더 생각해봄

 

아! Viewpager도 lifecycle에 의해 통제된다고 했지? --> 그러면 lifecycle에서 문제가 생겼을 가능성이 있음

그래서 ViewPagerAdapter인 FragmentAdapter (FragmentStateAdapter 상속)에 lifecycle 콜백함수를 오버라이드해서 로그를 찍어봄

 

순서는 onBindViewHolder() -> createFragment() 였음. 

원래 나는 createFragment에서 fragment이동을 할 때 전달받은 bundle을 초기화하여 보내려했음. 그렇게 해봤는데 여기서 bundle이 null이 찍힘. 아마도 lifecycle에 의해 onBindViewHolder가 실행되고 bundle이 사리진 것 같음

 

그래서,  onBindViewHolder()에다가 전역변수를 두고 초기화를 해봄 --> 오! null이 안찍히고 데이터가 정상적으로 넘어옴!

그렇게 해서 recyclerView에 binding을 했음...

 

테스트 해보면서 2차문제 발생!

 

2차문제 --> TodoWritingActivity에서 MainActivity로 넘겨줄 때 startActivity로 넘기고 Bundle을 통해 전달했는데 다음과 같은 현상이 발생함(이전 액티비티가 지워지지 않는 문제)

 

그래서 해결하려고 startActivity할 때, FLAG_ACTIVITY_CLEAR_TOP을 해서 액티비티 스택 제일 위에 있는 (이전 액티비티)를 지움 --> 위 문제를 해결

 

todo 추가 테스트를 계속하다가 3차문제가 발생함

 

추가를 해도 recyclerView에 아이템이 추가가 되는게 아니라 기존에 들어간 1개의 아이템의 내용만 바뀌는 현상을 발견

 

왜일까? 또 생각해봄..

 

이전 데이터가 사라졌네? 위에서도 lifecycle 관리가 잘못되서 null이 나왔는데 lifecycle문제인가?? 

-->  activity - fragment의 lifecycle 콜백 함수를 모두 오버라이드해서 로그를 찍어봄

startAcitivityForResult 사용전

 

1 - 앱을 처음 켰을 떄

2 - MainActivity 에서 fab를 눌러 TodoWritingActivity로 갔을 떄

3 -  TodoWritingActivity 작성이 끝나고 Main으로 다시 나올 떄

4 -  MainActivity 재시작

 

3~4에서 문제가 있음을 확인했다..

2번에서 적용한 Flag때문에 기존에 있던 액티비티가 사라지고 새로운 MainActivity가 만들어져서 기존의 MainActivity에서 유지하고 있던 TodoFragment의 정보도 다 사라지는 것이였다.

이 문제를 해결하기 위해 startActivity(Flag)를 없애고 액티비티끼리 데이터를 주고받는 ActivityLauncher- StartActivityForResult()를 도입하여 해결하였다.

 

StartActivityForResult()를 통해 새로운 액티비티를 만드는 것이 아닌 기존의 액티비티를 다시 활용하도록 하였다.

startAcitivityForResult 사용 후 - 3번을 보면 destroy -create가 아니라 restart가 된 것을 볼 수 있다.

그리고 fragment 상에서 전달 할 것으로 bundle을 사용하여 데이터를 각자(제목따로 내용따로) 보냈는데, 이점이 불편해서 데이터 모델을 담고 있는 리스트  자체를 넘기려보려다 보니까 모델의 직렬화가 필요해서 kotlin-parcelize를 사용하였다.

물론 이 방법이 최선은 아니겠지만 내 머리에서 생각한 최대한 인 것 같다.

 

 

 

 

 

 

 

 

2. 프로젝트 개요

프로젝트 S.A(개요) 작성

--> 소통을 하는 SNS 앱 프로젝트

 

와이어프레임

 

SA 피드백 후 개발 시작

profile

Apple is Apple

@mjjjjjj