TIL

24.01.16

re트 2024. 1. 16. 20:51
728x90

● 오늘 한 것

[kotlin 문제 풀이]

- 하노이 탑 이동 순서

https://retry-thinksubox.tistory.com/168

 

[팀프로젝트 2일차]

- 기능 구현 & 무한 회의

https://github.com/WorksWhale/WorksWhale

 

● 오늘 알게 된 것

[kotlin 문제 풀이]

- 하노이탑은 생각보다 간단한 편이었다.

 

[팀프로젝트 2일차]

- PR은 상당히 많은 사람의 관심이 필요한 부분이다.

- 협업은 상당히 어렵다.

- 생각보다 우리 앱 예쁘다.

 

● 오늘 팀플 때 완료한 것

탭바 기능 구현 완료 → 프래그먼트 이동(넘길 데이터가 존재하지 않음)

  • FrameLayout을 ViewPager2로 변경
  • 메인 액티비티의 탭 아이템의 아이디가 존재하면 에러가 떠서 아이디를 없앰
  • ViewPagerAdapter를 만듬
  • TabLayoutMediator를 통해 TabLayout과 ViewPager를 연결시킴
  • 탭 아이템의 텍스트를 TabLayoutMediator에서 정해줌
  • 연락처 추가 프래그먼트는 탭바를 통해 접근하는 것이 아니기에 추가시키지 않음

연락처 추가 다이얼로그에서 전화번호 자동 하이픈 설정

  • 처음에 xml에서 inputType을 phone으로 하고 코드 상에서 해당 뷰에 addTextChangedListener(PhoneNumberFormattingTextWatcher()) 를 붙여도 안 됐다.
  • 그래서 찾아보니까 시스템 언어로 설정된 나라의 전화번호 형식이 아니면 적용이 되지 않는 것이었다.
  • 설정에서 시스템언어로 한국어로 바꾸고 다시 실행했더니 해결됐다.

연락처 추가 다이얼로그에서 유효성 검사

  • 이전 팀플 때 사용했던 코드들을 수정하여 진행
  • EditText의 내용이 변할 때와 포커스 아웃 됐을 때 같은 에러 메세지 반환하는 EditText 확장 함수를 호출
  • 이름은 비어있을 때만 에러 메세지 출력
  • 전화번호는 비어있을 때와 010으로 시작하지 않을 때 에러 메세지 출력(String 확장함수 만듬)
  • 이메일은 비어있을 때와 이메일 형식에 맞지 않을 때 에러 메세지 출력(String 확장함수 만듬)
  • 메모는 비어도 괜찮기 때문에 유효성 검사 진행하지 않음
  • 부서도 스피너를 통해 선택하고 기본값이 존재하기 때문에 유효성 검사 진행하지 않음

연락처 추가 다이얼로그에서 스피너 추가

  • ArrayAdapter 사용(이후 커스텀 예정)
  • 처음에 this를 사용할 때 컨텍스트가 제대로 안 받아와져서 서칭을 했는데 액티비티에서 Fragment로 Null이 아닌 Context를 전달받아 사용하는 requireContext()를 알게 되었다.
  • 부서 리스트는 EditText의 리스트 형태로 만들었다.

연락처 추가 다이얼로그에서 저장 버튼 클릭 이벤트 설정

  • 저장소에 연락처 저장
  • 해당 이벤트에서 사용될 인터페이스를 만듬
  • 이 인터페이스는 메인 액티비티에서 구현되고 그 안에는 현재 저장소에 값이 추가되었음을 리사이클러뷰 어댑터에 알려줄 예정
  • 또한 토스트 메세지도 출력
  • 스피너 값을 가져와야 했는데 position 값이 없어 고민하다가 selectedItem을 알게 되어서 사용

연락처 추가 다이얼로그에서 버튼 활성화 설정

  • 버튼을 위해 enable을 기준으로 하는 셀렉터를 만듬(true일 때는 파란색, false일 때는 연한 파란색)
  • xml의 버튼 backgroun에 적용
  • 코드 상에서는 이름과 이메일, 전화번호에 에러 메세지가 없는 경우 버튼이 활성화되도록 작성
  • EditText 값 변화와 포커스 아웃 함수 안에 넣어놓음

에러메세지 모아두기

  • enum class에 에러 메세지를 한번에 보관
  • @StringRes 어노테이션을 이용해 문자열 아이디값을 저장
  • 그냥 문자열 적어놨던걸 snake_case로 이름지어 strings.xml에 저장

부서 이름 모아두기

  • 다이얼로그에서 부서 이름을 모아서 리스트를 만듬
  • 그냥 문자열 적어놨던걸 snake_case로 이름지어 strings.xml에 저장

뷰페이저의 프래그먼트 변화에 따라 상단 버튼 이미지 변경

  • 뷰페이저에 registerOnPageChangeCallback을 추가하고 onPageSelected를 오버라이드하여 변경했다.
  • registerOnPageChangeCallback은 뷰페이저를 사용하면서 currentItem을 변경하거나 화면을 스크롤 하여 다른 아이템으로 이동하는 경우에 사용할 수 있는 콜백 함수
  • onPageSelected는 뷰페이저에서 새로운 페이지로 도착했을때 호출되고 여기서 UI 갱신가능
  • 연락처 리스트에 있을 때는 뷰타입 변경을 위한 이미지, 마이 페이지에 있을 때는 내 정보 수정을 위한 이미지로 세팅
  • 이미지 material design에서 가져옴
  • 이전에 사용되던 이미지 vector asset으로 변경
  • 상단 버튼 눌렀을 때 이미지 변경과 타입 변경

내정보 수정 다이얼로그에서 넘겨줬다고 가정하고 데이터를 마이 페이지 프래그먼트로 넘겨 UI 업데이트

  • 진짜 너무 어려웠다.
  • 어댑터 형태를 바꿔보기도 하고, 어댑터 프래그먼트 추가를 따로 해보기도 하고, supportFragmentManager.findFragmentByTag도 써보고, Bundle도 사용해보고 했는데 실패
  • 제일 가깝게 한 건 adapter를 새로 만들어 프래그먼트를 새로 세팅하고 마이페이지를 첫 페이지로 세팅하는 거였지만 애니메이션 효과가 발생해서 포기…
  • 이외에 ViewPager에 프래그먼트가 배정되어있지 않다고 하거나 프래그먼트가 null이라는 에러가 떴다.
  • 나의 코딩의 빛 장세진 튜터님이 해답을 알려주시고 보완책도 알려주심
  • 바로 어댑터에서 프래그먼트를 따로 선언 및 초기화하는 것
  • 이 어댑터는 액티비티가 종료될 때까지 살아있고 그렇다면 만든 프래그먼트도 계속 살아있음
  • 프래그먼트의 함수를 만들어 접근이 가능해짐
  • 뷰바인딩도 되어 있는 상태
  • 일단 해결
  • 이후에 내 정보 수정 페이지 기능 구현 완료되면 setFragmentResult와 setFragmentListener를 이용해서 구현 보완하기

마이페이지 레이아웃 수정

  • 필요없다고 판단한 부서와 메모 칸 삭제
  • 부서는 내 정보 수정에서 부서 선택이 생긴다면 재추가 예정

연락처 저장소 부서 개수 구하는 함수 구현

  • sealed class의 data class는 접근하기 쉽지 않았다.
  • 가장 단순한 방식으로 반복문과 when을 사용했다.
  • 그리고 그 안에서 is 연산자로 어떤 타입인지 확인한 후 원하는 코드를 작성했다.

상태바 배경색, 아이콘색, 마이페이지 배경색 흰색으로 변경

  • 상태바는 window의 statusBarColor와 isAppearanceLightStatusBars를 사용하여 변경
  • 마이페이지는 레이아웃 xml에서 background속성 값을 줘서 변경

 

● 오늘 총평

하루가 짧다...

그러나 어제보다는 낫다...

반응형