안드로이드 개발 팁 #17 - 뷰 바인딩 적용된 프래그먼트에 데이터 바인딩 적용 후 빌드시 발생하는 오류
시작하며...
안드로이드 스튜디오의 프로젝트에서 Tabbed activity를 생성하면, 3개의 프래그먼트들이 자동으로 생성됩니다. 이들은 기본적으로 뷰 바인딩(view binding)이 적용되어 있고요. 이들에 데이터 바인딩을 적용했습니다. 이후 빌드에서 예상치 못한 오류가 발견되었습니다. 내용은 다음과 같습니다.
오류 내용
아래와 같이 특정 리소스 파일 이름이 유효하지 않다고 합니다. 파일 이름이 ic_bottom_menu_profile 3.xml인데요. 제가 추가한 것은 ic_bottom_profile.xml입니다. 뭔가 이상하죠?
Execution failed for task ':dorian-steem-ui:parseDebugLocalResources'.
A failure occurred while executing com.android.build.gradle.internal.res.ParseLibraryResourcesTask$ParseResourcesRunnable
Failed file name validation for file /Users/dorian-lee/Documents/GitHub/dorian-steem-apps/dorian-steem-apps-v1/dorian-steem-ui/build/intermediates/packaged_res/debug/drawable/ic_bottom_menu_profile 3.xml
해결 방법
혹시나 하는 마음에 아래와 같이 2가지 메뉴들을 실행해 보았습니다. 그 결과, 빌드가 이상없이 잘 작동됨을 확인했습니다.
- Clean Project 실행
- Rebuild Project 실행
시작하며...
한 주의 일정을 보여주는 앱을 만든다고 가정해 봅시다. 주간 일정은 테이블로 보여줘야 하는데요. 오늘 또는 특정일이 속하는 주의 모든 날들(7일이죠)을 알아야 합니다. 예를 들어봅시다. 오늘이 8월 6일 토요일이면, 8월 1일 (월)부터 8월 7일 (일)까지가 필요한 거죠. 이것을 코드로 어떻게 구현할 수 있을까요? 그것이 이번 포스트의 주제입니다.
특정일이 속하는 주의 월요일 구하기
LocalDate 클래스를 활용하여 2022년 8월 3일이 속하는 주의 월요일을 구해보겠습니다.
val date = "2022-08-03"
val monday = LocalDate.parse(date).with(DayOfWeek.MONDAY)
특정일의 다음 날, 다다음 날 구하는 방법
위 코드에서 월요일을 구했지요. 그 다음날인 화요일을 구하려면 그것의 plusDays(1)을 호출하면 됩니다. 다다음날인 수요일을 구하려면, 월요일 객체로부터 plusDays(2)을 호출하면 되지요.
val date = "2022-08-03"
val monday = LocalDate.parse(date).with(DayOfWeek.MONDAY)
val tuesday = monday.plusDays(1)
val wednesday = monday.plusDays(2)
특정일이 속하는 주의 모든 일들을 배열로 구하는 함수
위에서 설명드린 내용을 베이스로 특정일이 속하는 주의 모든 일들을 배열로 구하는 함수를 아래와 같이 만들어 보았습니다.
// 특정일이 속하는 주의 모든 일들을 배열로 구한다.
fun getWeekdays(
date: String // 특정일 (예: "2022-08-03")
): Array<LocalDate> {
// 특정일이 속하는 주의 월요일을 구한다.
val monday = LocalDate.parse(date).with(DayOfWeek.MONDAY)
// 해당 주의 모든 요일을 구하여 배열에 담는다.
return arrayOf(
monday,
monday.plusDays(1),
monday.plusDays(2),
monday.plusDays(3),
monday.plusDays(4),
monday.plusDays(5),
monday.plusDays(6)
)
}
오늘이 속하는 주의 모든 요일들 구하기
오늘 날짜는 LocalDate.now() 메소드를 호출하여 구할 수 있고요. 그것의 toString() 메소드로 오늘 날짜를 문자열로 읽을 수 있습니다. getWeekdays 함수 호출시 date 파라메터에 LocalDate.now().toString()을 대입하면 됩니다.
fun getCurrentWeekdays(): Array<LocalDate> {
return getWeekdays(LocalDate.now().toString())
}
지난 안드로이드 개발 팁
- #16 - 특정 일이 속하는 주의 모든 날짜를 배열로 구하는 방법
- #15 - RecyclerView에 리스트를 로딩한 후 처리할 일 작성
- #14 - RecyclerView 뷰에서 항목 클릭시 뷰가 깜빡이는 문제
- #13 - 공통으로 사용할 색상 리소스 만들고 뷰에 적용
- #12 - 코틀린 언어 변환시 추가로 수정할 build.gradle 파일들
- #11 - 리스트/배열로부터 찾을 원소의 위치 읽기
- #10 - 앱의 다크 모드 진입 막는 방법
- #9 - 데이터 바인딩/뷰 바인딩 사용하지 않을 경우 자체적으로 만드는 Views 클래스
- #8 - TextView에 linear gradient color 적용하기
- #7 - 다이얼 화면 연결하기 위해 Activity 클래스의 확장 메소드 작성
- #6 - 웹 브라우저를 여는 확장 메소드 작성
- #5 - HTML 적용된 TextView에서 링크 클릭은 어떻게 구현?
- #4 - RxJava의 Observable, Single 객체의 기본 설정 수행 메소드 정의하기
- #3 - 특정 화면 이동시 다른 화면 모두 닫기
- #2 - HTML 이스케이핑 적용된 문자 풀어주기
- #1 - TextView로 HTML 내용 보여주기
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
지난 안드로이드 개발 팁만 복사하려 했는데, 지난 포스트 전체가 복사되었네요. 내일 중으로 수정해야겠습니다.
Upvoted! Thank you for supporting witness @jswit.
@추천해
감사합니다.
안녕하세요.
이 글은 SteemitKorea팀(@jungjunghoon)님께서 저자이신 @dorian-mobileapp님을 추천하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!