분류 전체보기 59

Compose Snackbar 알림 관리를 위한 Utils

문제 상황HomeViewModel에 있는 message라는 변수를 통해서 snackbar를 관리하고 있습니다. 그런데 다른 뷰모델에서 api 통신시 발생하는 에러도 사용자에게 snackbar로 알려주고 싶어서, 뷰모델에 관련 없이 사용할 수 있도록 snackbar에 관련된 기능을 모아둔 유틸 파일을 하나 만들려고 합니다. SnackbarSnackbar는 Android 애플리케이션에서 사용자에게 간단한 메시지를 제공하는 데 사용되는 UI 요소입니다. Snackbar는 화면 하단에 잠시 나타났다 사라지는 방식으로, 사용자에게 피드백이나 안내 메시지를 제공할 때 유용합니다. 이는 사용자가 현재 작업 중에 다른 화면으로 이동하지 않고도 정보를 받을 수 있도록 합니다.Snackbar.make(view, "Item..

질문 정리 2024.06.20

Intent 정리: 문의하기 클릭 시 이메일 앱으로만 연결

문제 상황현재 진행하는 프로젝트에 문의하기 기능을 선택하면, 휴대폰의 기본 정보와 문의 이메일을 보내야하는 주소 등이 입력되서 이메일을 보낼 수 있도록 이메일 앱으로 이동하는 기능이 있다. 그런데 현재 문의하기 기능을 선택했을 때, 뜨는 앱들이 이메일 앱으로 필터링이 되는것이 아니라 모든 관련 앱이 선택할 수 있도록 리스트가 뜨기 때문에 앱 리스트의 종류를 제한하고, Intent에 대해서 한번 더 정리하려고 한다.싸피를 다닐 때, 안드로이드 강의 과정에서 이에 대해서 자세히 배웠으나 다 까먹고, 내 뇌에 남은 정보는 Intent는 개발자의 의도를 표현 이런 단편적인 내용 밖에 남아있지 않다. 그래서 그때 배우면서 정리했던 자료들과 android developers를 참고하여 다시 한번 간단하게 정리했습니..

질문 정리 2024.06.19

Kotlin에서 리스트와 맵의 변환: 순서가 유지될까?

문제 상황서버 통신으로 차트 데이터를 받아올 때, 데이터를 가공하면서 Map 자료구조를 사용하게 되었습니다. 그래서 Map 자료구조으로 변환하는 방법과 map으로 데이터 구조를 변경하는데 순서의 문제가 없는지 정리해봤습니다. 제가 알기로는 map은 데이터의 순서가 없고, list는 데이터의 순서가 있는데, list를 map으로 바꿨다가 다시 list로 바꾸는 경우 순서가 변경되는지를 중점으로 둔 조사입니다. Map에서의 순서리스트를 맵으로 변환할 때 순서의 유지는 변환 방법과 사용하는 맵의 종류에 따라 달라집니다. Kotlin에서 일반적인 Map 인터페이스는 순서를 유지하지 않습니다. 그러나 LinkedHashMap이나 SortedMap 같은 특정 타입의 맵을 사용하면 순서를 유지하거나 정렬 상태를 유지..

질문 정리 2024.06.18

안드로이드 알림 구현(헤드업 알림 포함)

문제 상황NotificationBuilder로 안드로이드 알림기능을 구현했는데, 카카오톡 알림처럼 화면 상단에 잠깐 떴다가 사라지는 알림은 생성되지 않았습니다. 당시에는 해당 알림의 이름도 몰라서 화면 상단에 뜨는 알림으로 검색을 했는데, 검색 결과 헤드업 알림이라는 것을 알게되었습니다. 그리고 헤드업 알림이 뜨지 않는 이유는 알림의 중요도를 적절하게 설정하지 않았기 때문이었습니다.알림 중요도채널 중요도는 채널에 게시된 모든 알림에 영향을 미칩니다. 제가 원하던 헤드업 알림을 위해서는 중요도를 IMPORTANCE_HIGH 로 설정해야했는데, 저는 IMPORTANCE_DEFAULT 로 설정했기 때문에 헤드업 알림이 표시되지 않았던 것입니다.알림 중요도 설정 방법Android 8.0(API 26) 버전 이상..

질문 정리 2024.06.17

Compose BackHander, 앱 종료가 안되는 이유

문제 상황테스트를 하는데, 앱 종료가 불가능한 오류를 발견했습니다. 문제의 원인은 다음 코드에서 확인할 수 있습니다. 과거에 작성한 BackHandler의 enabled 조건이 문제였습니다.navController = rememberNavController()BackHandler( enabled = navController.currentBackStackEntryAsState().value?.destination?.id != navController.graph.startDestinationId,) { navController.popBackStack()} 위 코드에 따르면 BackHandler 컴포넌트는 NavController의 현재 백스택 항목이 시작 목적지가 아닐 때만 활성화됩니다. 따라서 ..

질문 정리 2024.06.05

State와 StateFlow 차이

정리 이유안드로이드 개발 과정에서 State와 StateFlow를 상황에 맞춰 선택적으로 사용해왔습니다. 하지만 이 두 기술을 사용하는 구체적인 이유와 상황을 타인에게 명확히 설명하는 것이 어려웠기 때문에, 이에 대해 다시 조사하고 이해를 정리하고자 합니다.Stateprivate val _change = mutableStateOf(false)val change: State = _change 타입: State는 Jetpack Compose에서 제공하는 타입으로, 값이 변경될 때 재구성을 유발할 수 있는 값을 보유합니다. Composable 함수에서 읽히며 값의 변화를 감지하여 UI를 업데이트하도록 설계되었습니다.사용법: 주로 Jetpack Compose에서 UI와 관련된 데이터를 위해 사용됩니다. 사용자와..

질문 정리 2024.05.30

PDF 파일 다운로드를 사용자에게 알리기

문제 상황파일 스트림을 통해서 pdf를 다운로드하는 과정에서 사용자에게 다운로드 상태나 메세지가 보이지 않습니다. 따라서 사용자는 다운로드의 진행 상태를 알 수 없어 해당 기능을 사용하는데 불편함을 느낄 수 있습니다.따라서 pdf를 다운로드 하면 다운로드에 대한 정보가 사용자에게 제공되도록 개발을 하려고합니다.생각한 방법downloadManager 사용적합한 상황주로 웹에서 직접 파일을 다운로드할 때 사용됩니다. 다운로드할 리소스는 웹상의 URI 형태로 제공되어야 하며, 이 URI는 HTTP 또는 HTTPS 프로토콜을 사용해 접근 가능한 파일이어야 합니다.대용량 파일 다운로드: 대용량 파일이나 긴 다운로드 시간이 필요한 파일을 다운로드할 때 유용합니다.앱 사용 중이 아닐 때도 다운로드 필요: 앱이 백그라..

질문 정리 2024.05.29

안드로이드 컴포즈 페이스북 로그인 연동 정리

1. 필요한 의존성 추가프로젝트의 build.gradle 파일에 필요한 의존성을 추가합니다.plugins { id("com.android.application") version "8.1.1" apply false id("org.jetbrains.kotlin.android") version "1.8.10" apply false id("com.google.dagger.hilt.android") version "2.45" apply false id("com.google.gms.google-services") version "4.4.0" apply false id("com.google.firebase.crashlytics") version "2.9.9" apply false}plugi..

질문 정리 2024.05.26

위임하는 방식(By)과 직접 할당하는 방식(=)의 차이는 무엇일까?

현재 프로젝트의 마감일이 가까워짐에 따라 코드를 점검하는 과정에서 다음의 방식을 혼용하고 있음을 알게 되었습니다.val a = getSurveyViewModel.a.collectAsState().valueval a by getSurveyViewModel.a.collectAsState()val a by viewModel.a.collectAsState()이 구문에서 by 키워드는 위임(delegate)을 의미합니다.collectAsState()는 Flow를 State로 변환하는 함수입니다. 이 함수는 Compose에서 상태(State)를 구독(subscribe)하고 UI를 다시 렌더링할 수 있게 해줍니다.by 키워드를 사용하면 State 객체를 a 변수에 위임하여, a 를 직접 State 객체처럼 사용할 수..

질문 정리 2024.05.24

안드로이드 컴포즈 구글 로그인 연동 정리

1. Google Service 추가프로젝트의 build.gradle 파일에 Google 서비스 플러그인과 Google 로그인 라이브러리를 추가해야합니다.// Project-level build.gradleplugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("com.google.gms.google-services")}dependencies { //firebase implementation(platform("com.google.firebase:firebase-bom:32.7.0")) implementation("com.google.firebase:firebase-analytics")..

질문 정리 2024.04.28