일일회고
입문 프로젝트가 시작되었다. 동시에 선발대 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 콜백 함수를 모두 오버라이드해서 로그를 찍어봄

1 - 앱을 처음 켰을 떄
2 - MainActivity 에서 fab를 눌러 TodoWritingActivity로 갔을 떄
3 - TodoWritingActivity 작성이 끝나고 Main으로 다시 나올 떄
4 - MainActivity 재시작
3~4에서 문제가 있음을 확인했다..
2번에서 적용한 Flag때문에 기존에 있던 액티비티가 사라지고 새로운 MainActivity가 만들어져서 기존의 MainActivity에서 유지하고 있던 TodoFragment의 정보도 다 사라지는 것이였다.
이 문제를 해결하기 위해 startActivity(Flag)를 없애고 액티비티끼리 데이터를 주고받는 ActivityLauncher- StartActivityForResult()를 도입하여 해결하였다.
StartActivityForResult()를 통해 새로운 액티비티를 만드는 것이 아닌 기존의 액티비티를 다시 활용하도록 하였다.

그리고 fragment 상에서 전달 할 것으로 bundle을 사용하여 데이터를 각자(제목따로 내용따로) 보냈는데, 이점이 불편해서 데이터 모델을 담고 있는 리스트 자체를 넘기려보려다 보니까 모델의 직렬화가 필요해서 kotlin-parcelize를 사용하였다.
물론 이 방법이 최선은 아니겠지만 내 머리에서 생각한 최대한 인 것 같다.
2. 프로젝트 개요
프로젝트 S.A(개요) 작성
--> 소통을 하는 SNS 앱 프로젝트
와이어프레임

SA 피드백 후 개발 시작
'내일배움캠프 7기 > TIL' 카테고리의 다른 글
내일배움캠프 7기 Android TIL 24일차 (2023.08.17) (0) | 2023.08.17 |
---|---|
내일배움캠프 7기 Android TIL 23일차 (2023.08.16) (0) | 2023.08.16 |
내일배움캠프 7기 Android TIL 21일차 (2023.08.11) (0) | 2023.08.11 |
내일배움캠프 7기 Android TIL 20일차 (2023.08.10) (0) | 2023.08.10 |
내일배움캠프 7기 Android TIL 19일차 (2023.08.09) (0) | 2023.08.09 |