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속성 값을 줘서 변경
● 오늘 총평
하루가 짧다...
그러나 어제보다는 낫다...
반응형