일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- LaunchedEffect
- isFinishing()
- databinding error
- android compose
- @provides @binds 차이
- LaunchedEffect vs rememberCoroutineScope
- @stable
- WindowManager$BadTokenException
- Android
- Python
- Could not find method
- dispatchTouchEvent
- android mvi
- [databinding]
- 안드로이드
- android.view.WindowManager.BadTokenException
- 레트로핏
- 힐트
- {"msg":"cannot find method
- databinding xml
- onIntercepterTouchEvent
- 터치이벤트 순서
- 안드로이드 다이얼로그 오류
- @immutable
- material3
- android compose stable
- compose side-effect
- rememberCoroutineScope
- Java
- effect api
- Today
- Total
목록개발기록/안드로이드 (16)
개발관련일지
힐트에 대해서 기본과 궁금했던 부분들 정리 힐트는 안드로이드에서 의존성주입 라이브러리이다. Dagger2에서 단순하게 만들기 위해서 만들어졌고 Dagger2 기반으로 빌드된다. Dagger2를 사용해본적은 없지만 힐트가 Dagger2에서 파생된거여서 아주 기본적인부분은 정리했다. Dagger2 class MyApplication : Application() { val appContainer = AppContainer() // 컨테이너 선언 } class LoginContainer(val userRepository: UserRepository) { val loginData = LoginUserData() val loginViewModelFactory = LoginViewModelFactory(userRep..
composable은 순수함수 처럼 사용하기위해서 (f(state) = view) side effect가 없는게 좋지만 필요한 경우에는 생명주기를 인식하고 관리되는 환경에서 시행되야함 -> 이걸 도와주는게 Effect API이다. LaunchedEffect 컴포저블내에서 suspend fun을 안전하게 실행해준다. @Composable @NonRestartableComposable @OptIn(InternalComposeApi::class) fun LaunchedEffect( key1: Any?, block: suspend CoroutineScope.() -> Unit ) { val applyContext = currentComposer.applyCoroutineContext remember(key1) ..
컴포즈에서 @stable 어노테이션을 봤는데 뭔지 몰라서 알아보게됨 리컴포지션이랑 관련이 있따. 리컴포지션은 인풋값이 변경 될떄 컴포저블 함수를 다시 호출 하는 과정인데 stable(안정성)을 이용해서 런타임중에 파라미터중에 어느것도 업데이트 되지 않았다라는 것을 확신을 하거나 변경을 확인한 이력이 있는 경우의 변경된게 없을 경우 스킵을 한다. 컴포즈의 상태가 변경 될 떄 컴포즈내에 상태객체가 읽히는 모든 지점위의 가장 가까운 재시작가능한 함수를 찾는다(리컴포지션을 최소화하기위함). 로우,컬럼,박스 같은 기본 컴포저블들은 인라인함수로 동작 -> 컴파일 후 함수로 되어있지 않기 때문에 리컴포지션 시작지점이 될 수 없다. 부모로 부터 자식노드까지 변경된 파라미터가 있는경우 재생성된다. 이렇게 컴포저블의 파라..
안드로이드 컴포즈 학습하는 도중 material3 theme , 사이즈 변화에 대해서 어떻게 대응하나 학습하기 위해 Reply 샘플앱 대해서 전체적인 구조를 파악하기 위해서 학습 Jatpack Compsose는 M3를 사용할 수 있는 구현체를 제공하고 있으며 M3가 적용된 프로젝트를 생성하면 theme 디렉토리가 있고 기본적으로 Color, Theme , Type 세개의 파일이 생성 되어있다. color scheme과 typography를 정의하고 MateralTheme에 적용이 가능하다. Color Scheme에서 주요색상을 기준으로 톤을 변경하면서 M3의 컬러 유틸리티 색상파레트를 이용한다. 각 색상값들이 슬롯(이름)이 존재한다. 색상들을 미리 정의해놓고 theme를 사용한다. 위의 사진이 M3에서 ..
첫번째 java.lang.IllegalStateException: Could not find method @{(v) -> item.listener.onItemClick android:onClick="@{(v) -> item.listener.onItemClick(v , item) " ★ } 빠짐 이런식으로 나오는 경우 xml파일에 선언한 부분에서 오타가 있는지 확인 나같은 경우는 } 하나 빠져있엇음 두번째 [databinding] {"msg":"cannot find method onItemClick(android.view.View, 선언된클래스위치) in class xml경로 , "pos":[{"line0":17,"col0":34,"line1":17,"col1":82}]} android:onClick="@..
안드로이드에선 앱에 저장소가 2가지가있다. 내부 저장소(Internal Storage) , 외부 저장소(External Storage) 내부저장소 해당 앱의 private 공간이며 다른앱에서 접근이 불가능하다 노출되면 안되는 앱의 데이터가 사용되게 된다. 위의 내용으로 구성 되어져있다 외부저장소 public하게 공개되는 공간이다. 권한만 있게되면 엑세스가 가능하다. 외부저장소가 안드로이드Q (api29)부터 구조가 바뀌었다. api29를 기준으로 이전의 스토리지 형태를 다르게 부른다. version legacy storage version >- api29 -> scoped storage 구조를 이해하는데 가장 도움이 되었던 글이다. 출처 legacy storage (안드로이드 Q 이전..
WindowManager$BadTokenException 처음 보는 오류여서 검색해보았는데 대부분 유저들의 내용으론 화면에 보여질 컨테스트와 다이얼로그의 문제였다 내 경우는 죽은 액티비티에 서브스레드에서 다이얼로그를 요청하는 상황에서 에러가 나온다 생각했다. 위와 같은 상황이었고 서브스레드를 돌려놓고 엑티비티를 종료하니 에러를 만날 수 있었다. 해결방법으론 엑티비티의 종료여부를 보고 다이얼로그를 안띄우는 방식이 있엇다 isFinishing()을 사용해서 아래 코드처럼 해결이 될것이다 1 2 3 4 5 6 7 8 9 10 11 12 13 14 if(! 액티비티.this.isFinishing()){ new MaterialAlertDialogBuilder(액티비티.this) .setTitle("제목") .se..
뷰가 겹쳐져있는 상황이 발생했고 그중에서 특정 뷰가 터치 되었을 시 이벤트를 받아야할 상황이 생겨서 찾아본 내용을 정리 안드로이드에서 xml로 사용자에게 보여줄 화면을 만들게 될 시 View(UI Widget) 와 ViewGroup(linear , frame , constraint etc) 객체를 이용해서 만든다. 뷰그룹 안에 뷰그룹 혹은 뷰를 배치하게 되며 유저가 화면에서 뷰그룹 혹은 뷰를 터치했을 경우 클래스에서 어떤 흐름으로 코드가 동작하는지 찾아보았다 스택오버플로우에서 확인 한 내용의 경우 엑티비티 -> 뷰그룹 -> 뷰 순으로 터치가 코드가 동작한다고 나와있었으며 직관적인 그림이 나와있었다 우측 사진의 왼쪽화살표를 보면 알 수 있듯이 상위뷰 먼저 dispatchTouchEvent() -> onIn..