분류 전체보기 411

delay 혹은 애니메이션 후 이벤트 발생시 binding에러

binding null cannot be cast to non-null type VB 베이스 프레그먼트에 binding데이터를 넣어둔뒤 바텀시트 동작시 키보드가 뜨도록 작업이 되어있었습니다. 바텀시트 호출 -> 키보드 올라오는 도중 (해당 화면 종료) -> 바텀시트 내려가면서 키보드 Hide 이미 화면이 종료되어 binding이 null이었습니다! BaseFragment 이렇게 선언 되어있었는데 null이 됩니다 근데 또 화면에 lateinit으로 된곳은 null이 되지 않는 것 같습니다!? private lateinit var binding 일단 내가 작업하는 소스에는 이렇게 두가지의 코딩이 있었습니다. 1. 번의 해결은 화면이 종료되었는지 판단하여서 호출하지 않도록 해결 open val isAttac..

안드로이드 2023.05.19

[kotlin] mapTo

mapTo https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/map-to.html mapTo - Kotlin Programming Language kotlinlang.org inline fun Array.mapTo( destination: C, transform: (T) -> R ): C collection 프레임워크 사용시 각 element의 변형을 거쳐 다른 collection에 쉽게 복사할 수 있는 함수 나는 filter를 걸어서 원하는 타입의 뷰중에 데이터만 리스트로 뽑았다.(헤더에 data는 null이라서) 참조 : https://skytitan.tistory.com/180

코틀린 & Java 2023.05.18

savedStateHandle로 ViewModel의 상태를 저장하자

savedStateHandle로 ViewModel의 상태를 저장 PR리뷰로 (Activity or Fragment)에서 사용하던 savedInstanceState를 ViewModel의 savedStateHandle로 사용해달라는 요청이 왔습니다. 검색하면서 궁금했던 점 1. 아래 글을 보면 savedStateHandle.set과 get이 있습니다. 따로 set/get은 하지 않아도 된다고 함. savedStateHandle 안에 intent로 넘어온 값이 들어있음 로그를 직접 찍어보니 Fragment의 savedInstanceState는 null이고 (true값) ViewModel의 savedStateHandle는 데이터가 있었다. (intent안에 있는 값들이다.) 그래서 뷰 모델의 LifeCycle은..

코딩/코드리뷰 2023.05.18

OS 6이하에서 벡터 이미지 제대로 안나오는 문제

Android 6.0, Marshmallow 이하의 버전에서 아이콘이 깨지는 현상이 발생하였습니다. Android 6.0 이하의 버전에서는 이미지를 추가할 때, app:srcCompat을 사용해야 하는데 그렇지 않아서 아이콘이 깨지는 문제가 발생하였습니다. 그래서 android:src 대신 app:srcComapt을 사용하도록 변경했으며, selector로 적용한 이미지들은 프로그래밍 방식으로 적용하여 해결했습니다. 원인 : fillType:"ovenOdd" 속성의 지원 가능 api level이 24 이상이기 때문에 23이하 기기에서 정상적인 이미지가 보이지 않음 - 회사분이 코멘트 주심! 어떤게 정확한 답변인지는 잘 모르겠음! srcCompat으로 제대로 나오기도 하니깐.? 아무튼 프로그래밍 해결 방법..

안드로이드 2023.05.11

Android 갤러리 contentResolver DATE_TAKEN 문제

Android 갤러리 contentResolver query시 DATE_TAKEN 및 DATE_ADD가 제대로 들어있지 않은 문제가 발생. 이슈 발생은 : 폰을 변경하거나 이미지를 옮겨서 가져온 경우에 발생하는 것 같다. 이것저것 가져와서 로그를 찍어보니 date_taken, date_add, date_modified 등 DATE format으로 보니 1970년 1월로 찍혔습니다. (사진에 따라 day 값이 좀더 포함된 경우가 있음.) 기존 로직에서 1970/01/30 보다 작을 경우에는 파일의 lastModified날짜를 가져와서 sort시켜줬는데 나중에 리스트 insert가 다되고 notifychanged하는 부분에서 사진들의 정렬이 바뀌어 문제가 생겼다. 검색하다보니 DATE_TAKEN 칼럼이 Ap..

안드로이드 2023.05.10

delegated property 프로퍼티 접근자 로직 재활용

프로퍼티 접근자 로직 재활용 위임 프로퍼티(delegated property) 값을 뒷받침하는 필드에 단순히 저장하는 것보다 더 복잡한 방식으로 작동하는 프로퍼티를 쉽게 구현할 수 있다. 프로퍼티는 위임을 사용해 자신의 값을 필드가 아니라 데이터베이스 테이블이나 브라우저 세션, 맵 등에 저장할 수 있다. 위임은 객체가 직접 작업을 수행하지 않고 다른 도우미 객체가 그 작업을 처리하게 맡기는 디자인 패턴을 말한다. 이때 작업을 처리하는 도우미 객체를 위임 객체라고 부른다. class Delegate { operator fun getValue(...) {...} //getValue는 게터를 구현하는 로직을 담는다. operator fun setValue(..., value: Type) {...} // set..

Kotlin 구조 분해 선언과 component 함수(Pair, Triple)

구조 분해 선언과 component 함수 구조 분해 선언(destructuring declaration) >>> val p = Point(10, 20) >>> val (x, y) = p // x와 y 변수를 선언한 다음에 p와 여러 컴포넌트로 초기화 >>> println(x) 10 >>> println(y) 20 구조 분해 선언의 각 변수를 초기화하기 위해 componentN 이라는 함수를 호출한다. class Point(val x: Int, val y: Int){ operator fun component1() = x operator fun component2() = y } 여러 값을 한꺼번에 반환해야 하는 함수는 구조 분해 선언 구문을 사용하면 쉽게 풀어서 여러 변수를 넣을 수있다. //값을 저장하기 ..

Kotlin 범위 관례 인덱스로 원소 접근 Get, Set

범위 관례 인덱스로 원소 접근 Get, Set 콜렉션에서 가장 많이 쓰이는 연산은 인덱스를 이용해 읽고 쓰는 연산 자바에서 배열 원소에 접근할때 [ ] 를 사용하는 것처럼 코틀린의 맵에서도 이를 사용한다. callbackParamMap["success"] = true /** * Allows to use the index operator for storing values in a mutable map. */ @kotlin.internal.InlineOnly public inline operator fun MutableMap.set(key: K, value: V): Unit { put(key, value) } class ExampleUnitTest { @Test fun test() { val list = m..

Kotlin == 비교연산자 오버로딩

비교연산자 오버로딩 equals, compareTo 대신 Kotlin 에서는 == 비교 연산자를 사용할 수 있음 equals == 연산자는 equals 메서드 호출로 컴파일된다. a==b → a?.equals(b) ?: (b==null) val USE_KAKAO_ACCOUNT_LOGIN = env.name == "DEV" // Decompiled static { USE_KAKAO_ACCOUNT_LOGIN = Intrinsics.areEqual(env.name(), "DEV"); } // ---------------------------------- val USE_KAKAO_ACCOUNT_LOGIN = env.name === "DEV" // Decompiled 하면? env.name == "DEV" htt..