본문 바로가기

안드로이드/코틀린

(32)
[Android] Compose 도입 ( 마이그레이션 ) Kotlin DSL로 작성되었습니다. build.gradle ( app level ) android{ .... buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.4.3" } } 컴포즈 버전을 선택하실땐 공식문서를 확인하셔서 사용중인 코틀린 버전과 호환되는 버전을 선택하시고 너무 오래된 버전을 사용중이시라면 이번 기회에 올리는 것을 추천드립니다. Dependencies const val composeVersion = "1.4.3" const val composeUi = "androidx.compose.ui:ui" const val composeGraphics = "androidx.compose.ui:ui..
[Android] 특정 위치로 스크롤 하기 ScrollView하위 뷰중 특정 뷰로 스크롤 되도록 하는 기능을 구현했습니다. 먼저 제가 작업한 뷰의 구조는 아래 사진과 같습니다. 타이틀과 백버튼이 있는 Top 영역과 그 아래 컨텐츠를 담고 있는 ScrollView 로 이루어진 간단한 엑티비티 입니다. 방식은 간단하게 특정 뷰가 화면내 어떤 위치에 위치하고 있는지 좌표를 구하고 그 좌표 만큼 스크롤 합니다. view.getLocationOnScreen(outLocation: IntArray) 특정뷰 상단이 스크롤뷰 상단에 걸리도록 private fun scrollToView(view: View){ var statusBarHeight = CommonViewUtil.getStatusBarHeight(context = this) val viewLocati..
[Android] 다크 테마 적용하기 Android 10 ( API 29 ) 부터 제공되어 여러 장점을 가지고 있습니다. - 전력 사용량을 절약 - 시력이 낮거나 밝은 빛에 민감한 유저의 가시성 개선 - 한낮에 직사광선에 노출되는 경우 가시성 개선 다크 테마는 디바이스뿐만 아니라 각 앱 별로도 설정이 가능합니다. 기본적으로 앱에는 디바이스 테마를 따라가도록 되어 있지만 설정 값을 제공하는 앱들을 간혹 보신적이 있으실 겁니다. 예시 아래 앱은 제가 운영중인 톡썰만들기 앱입니다. 꼭 필요한가? 그렇진 않습니다. 하지만 있다면 플러스 요인인건 맞다고 생각합니다. 저도 디바이스 다크모드를 사용하지 않기 때문에 필요성을 못 느꼈지만 유저의 요구 사항이 있어 추가하게 됐습니다. 다크 테마 적용 아래 코드를 테마설정하는 화면과, 앱 시작하는 화면에 추가..
[Android] Room 초기 데이터 설정 두가지 방법으로 초기 데이터를 설정할 수 있습니다. 1. addCallback이용 @Database( version = 1, entities = [Food.Item::class, Sort.Item::class, Category.Item::class] ) abstract class DB: RoomDatabase() { abstract fun foodDao(): Food.Dao companion object{ private val databaseName = "recommend.db" private var INSTANCE: DB? = null fun getInstance(context: Context): DB{ return INSTANCE ?: synchronized(DB::class){ INSTANCE ?:..
[AOS] Room 사용시 이미지 비트맵으로 저장하기 이미지 저장시 Bitmap으로 저장하면 백업 파일을 만들어 디바이스간 데이터 이동 기능을 구현할 수 있습니다. 저는 백업 기능을 염두에 두지 않고 작업하다 보니 앱 내부 스토리지에 저장된 이미지의 경로를 저장하는 방식을 사용했습니다. 앱 전용 내부 디비가 있어서 사진첩에서 사진을 지워도 이미지는 보존되지만 앱을 삭제하면 되돌릴수 없기 때문에 필요에 맞게 선택하시면 될것 같습니다. Plant Table @Entity(tableName = "plant") data class Item( @PrimaryKey(autoGenerate = true) var id: Long? = null, var name: String = "", var nickName: String = "", var image: Bitmap? = ..
[AOS] 서드파티 앱을 이용하여 이메일 전송하기 & 앱내 문의하기 기능 구현 제가 운영하는 개인 앱에는 이용하면서 겪은 불편함을 이메일을 통해서 받구 있습니다. 별도 페이지를 작성해서 자세한 정보들을 받을 수도 있지만 서버를 별도로 운영하지 않기 때문에 이메일 방법을 선택했고, 생각보다 많은 사용자들이 불편함과 건의사항들을 보내주셔서 다음 개발 기능 및 예상치 못한 버그들을 잡는데 유용하게 쓰고 있습니다. 아직 구현하지 않으신분들은 구현을 강력 추천합니다! 이메일 전송 기능 실제 운영중인 앱에 캡쳐 화면으로 '[개발자에게 문의하기]'를 클릭 했을때 사진입니다. 문의시 받는 이메일 주소와 제목이등 필요 내용을 자동으로 입력된 상태로 사용자에게 노출됨으로써 불편함을 최소화 했습니다. private fun sendInquiryEmail() { try { var intent = Inte..
[AOS] Retrofit Response 동적 파라미터 Type으로 받기 서버 통신 응답 결과를 저장하는 DTO를 생성할땐 일반적으로 타입과 이름이 명시적입니다. data class UserRes( val email: String?, val name: String? ) 하지만 어떤 타입인지 모르거나 필드명을 모를 경우엔 어떻게 해야할까요? 서버측에서 필드명과 값들을 String으로 통일시켜서 내려주면 String으로만 받아서 사용하면 되지만 운영하는 서비스가 앱 포함 여러가지일 경우, 개발 스타일등의 이유로 저처럼 다이나믹한 결과값을 대응해야 하는 경우가 있습니다. 예를들어 유저가 종류가 다양하여 직군 별로 테이블에서 필드명을 관리한다고 가정했을때 각 직군 별로 있는 일치하는 필드가 있고 그렇지 않은 필드들이 있을 수 있습니다. 그렇기 때문에 데이터를 응답받을땐 직군별 필드키..
[Kotlin] Filter 함수로 For문 대체하기 코틀린의 Filter함수를 사용하면 for문과 if문을 보다 간결하게 표현할 수 있습니다. 성능상 이점을 확인하긴 어렵지만 프로그램의 규모가 커질수록 가독성 부분에선 이점을 확실하게 확인할 수 있습니다. 러닝커브가 높진 않지만 활용하려면 조금 생각을 해야합니다. 하지만 for문과 if문은 평소에 많이 사용하기 때문에 익숙해질수록 좋다고 생각합니다. 아래 5명의 사람중 선택된 사람의 이름들만 뽑는 메소드를 만든다고 가정하겠습니다. 결과 : "사람1,사람3,사람5 " data class Person(val name: String, val isSelect: Boolean) var list = listOf( Person("사람1",true), Person("사람2",false), Person("사람3",true..