Android

Android

Android BottomSheetDialogFragment Height 조절하기

이번에 프로젝트를 진행하며 가장 힘들었던 BottomSheet의 높이를 조절하게된 과정을 소개하려고 한다. 내가 의견을 내서 사용하게된 Material 디자인의 BottomSheet 기능인데 이렇게 고된 길을 걷게 될 줄 몰랐다. 왜 BottomSheet height를 조절해야 하지? Customizing이 된 BottomSheet를 사용하기 위해 BottomSheetDialogFragment를 상속하여 만든 CustomBottomSheetDialogFragment 클래스를 만들었다. 그리고 막연하게 onCreateView에서 뷰를 바인딩해주고 실행해본 결과 계속 BottomSheet가 엄청 찔끔 올라왔다. 해당 화면을 캡쳐해두진 않아서 보여줄 순 없지만 화면 높이의 1/10정도..? 이유는 기본적으로 ..

Android

Android DialogFragment Button Text Size(텍스트 크기 조절)

DialogFragment를 사용하던 중 Positive, Negative Button의 텍스트 사이즈 조절이 필요해졌다. DialogFragment에서는 onCreateDialog에서 AlertDialog.Builder가 create한 AlertDialog를 리턴하는데 create 이전에 간단한 다이얼로그 생성하듯 setTitle, setMessage, setPositiveButton 등을 호출한다. 나는 여기서 setPositiveButtonTextSize와 같은 메소드가 있을 줄 알았지만 없었다. (그러니깐 이 글을 쓰고 있겠지만) 아래는 onCreateDialog 메소드를 사용한 gist이다. https://gist.github.com/BonusTrack02/a22f1ef8c29dae79e6fca..

Android

Android RecyclerView ItemDecoration in Kotlin

내가 이 클래스를 사용하게 된 이유 내가 사용하던 RecyclerView에는 각 아이템 하단에 구분선(Divider)이 있다. 이전에는 해당 아이템을 구성하는 xml에 MaterialDivider를 배치했었다. 새로운 요구사항이 들어오면서 구조 변경의 필요성을 느끼게 되었다. 새로운 요구사항은 마지막 아이템은 구분선이 가로 전체를 차지하도록 변경하는 것이었다. 새로운 요구사항에 따른 시도 RecyclerView Adapter의 onBindViewHolder에서 마지막 아이템을 확인해서 AttributeSet을 다시 할당해주었다. 나름 그럴싸한 로직이라 생각했다.(내 기준) 그 결과, 알 수 없는 버그들이 밀려들어왔다. 처음 adapter를 할당했을 땐 마지막 아이템에만 해당 AttributSet이 적용되..

Android

Codelab으로 Room 알아보기 - 2. Create the SleepNight entity(ㄴ)

Step 1. Create the SleepNight entity 이번 과제에서는 하룻밤 수면을 데이터베이스 엔티티를 의미하는 annotated data class로 정의한다. 하룻밤의 수면을 위해서는 시작 시간, 종료 시간, 퀄리티 등급을 기록해야 한다. 그리고 하룻밤을 구분하기 위해 고유 아이디가 필요하다. 1. database 패키지의 SleepNight.kt 파일을 연다. 2. SleepNight 데이터 클래스를 id, 시작 시간(millisecond 단위), 종료 시간(millisecond 단위), 숫자의 수면 퀄리티 등급 파라미터를 사용해 만든다. 품질 데이터가 수집되지 않았다는 것을 나타내기 위해 sleepQuality를 -1로 초기화해야 한다. 시작 시간을 유효한 시간으로 초기화한다. 선택..

Android

Codelab으로 Room 알아보기 - 2. Create the SleepNight entity(ㄱ)

안드로이드에서 데이터는 데이터 클래스로 표현된다. 이 데이터는 함수 호출에 의해 접근되고 수정될 수도 있다. 그러나, 데이터베이스 세계에서는 데이터에 접근하고 수정하기 위해서는 entity와 query가 필요하다. 엔티티는 속성과 함께 데이터베이스에 저장할 객체나 개념을 의미한다. 우리의 앱 코드에서 테이블을 정의하는 entity class가 필요하다. 해당 클래스의 각 인스턴스는 해당 테이블의 행을 의미한다. Entity class는 데이터베이스의 정보를 표시하고 상호 작용하는 방법을 Room에 알려주는 맵핑이 있다. 우리 앱에서 엔티티는 하룻밤 수면에 관한 정보를 가지고 있을 것이다. 쿼리는 테이블(혹은 테이블 조합)의 정보 또는 데이터 요청이거나 데이터에 대한 작업을 수행하기 위한 요청이다. 일반적..

Android

Android Notification Max Count

저번 Notification 글에 이어 이번 글은 알림 최대 갯수에 관한 포스팅이다. 글을 시작하기 앞서, 여러 자료를 통해 확인한 부분도 있고 내가 수동으로 테스트를 통해 직접 확인한 부분도 있다. 물론 확인되지 않은 부분도 있다. (이런 부분은 계속 짚고 넘어갈 예정이다.) 알림 최대 갯수라고 해서 헷갈릴 수 있는데 앱마다(?) 백그라운드에서 알림이 누적되는 최대치가 있다. (사실 앱마다인건지 해당 알림의 channelId마다인 지는 정확하지 않다) 아무튼 알림이 누적되는 양이 제한되는데 갤럭시 플래그십 라인업은 24개가 대부분이다. (OS 10 이상) 회사에서 Pixel폰으로 테스트해보았을 때는 50개였다. (스택오버플로우에서 찾은 구글 소스 코드 원본도 50개가 최대치이다.) 특정 폰에서는 10개..

Android

Android Notification 누적시키기

상용 앱들을 보면 어떤 푸시 알림이 왔을 때 해당 푸시가 누적되는 경우가 다반사이다. 하지만, 나는 해당 기능에 대해 구현할 생각을 해본 적이 없었다. 이 때, 갑자기 회사에서 '푸시가 1개밖에 안 쌓여요. 푸시가 누적되게 해주세요.' 라는 요청을 받았다. 기존 코드 notificationManager.notify(0, notificationBuilderCompat.build()) 이 상황에서는 무조건 0번 id로만 notify하기 때문에 새로운 푸시 내용이 도착해도 기존 푸시가 갱신된다. 해결한 코드 notificationManager.notify((System.currentTimeMillis() / 500).toInt(), notificationBuilderCompat.build()) 이렇게 코드를 ..

Android

Android Deep Link 사용 시 겪은 에피소드

이번에는 아주 어이없는 실수를 해버린 에피소드를 하나 소개해보려한다. 다른 앱에서 딥링크를 통해 내 앱을 실행하는데 앱이 비정상 종료되는 문제였다. 소위 말하는 앱 크래시현상이다. 이유가 뭐였을까? 먼저 내 앱은 딥링크로 앱 실행 시 스플래시 화면으로 진입하게 되고, 여기서 intent의 data안에 있는 uri를 파싱해 토큰을 얻어온 다음, Extra와 함께 로그인 화면으로 넘어간다. 여기서 갑자기 런타임 에러가 났다는 건데... 나의 경우에는 총 2가지 문제가 있었다. 조건문에서 null처리가 되지 않은 문제(온전한 나의 문제) 딥링크가 정상값이 아님(서버 측 문제) 나의 문제였던 1번의 경우, 앱 푸시를 눌렀을 때 진입점이 같은 스플래시 화면이었다. 여기서 딥링크로 앱을 실행할 때와 차이점이 발생..

Android

Codelab으로 Room 알아보기 - 1. Download and inspect the starter app

이번에는 드디어 Room Database에 대해 알아보러 간다. 완전 처음 보는 코드들이 나를 기다리고 있으리라 믿는다. (자랑은 아닌 듯하다) 시작하겠다. 1. Download and run the starter app 먼저 Github에서 앱을 다운로드 받는다. https://github.com/google-developer-training/android-kotlin-fundamentals-starter-apps/tree/master/TrackMySleepQuality-Starter GitHub - google-developer-training/android-kotlin-fundamentals-starter-apps: android-kotlin-fundamentals-starter-apps andro..

Android

Android Notification channel 설정이 적용안되는 경우

나의 상황 출시 초기 버전에서 생성한 Notification channel에는 mp3파일로 소리 설정이 되어있었고, 진동은 설정값이 없었다. 이번에 진동을 설정하고 소리를 변경하기 위해서 검색하다보니 OS 8.0 이상의 경우, Notification channel에 소리와 진동 설정을 해줘야 했다. 나는 여러 글에서 찾은 방법으로 코드를 구성했고 앱을 실행했지만 소리와 진동 설정은 정상적으로 되지 않았다. 해결법 앱을 삭제 후 재설치하거나 앱 데이터를 삭제한 뒤 재실행한다. 개인적인 추론 Android Developer 사이트에서 힌트를 찾아볼 수 있었다. 진동 설정을 위해 찾아본 메소드에 이런 내용이 있다. 마지막 줄에 보면 NotificationChannel이 create되는 메소드에 전달되기 전까지..

BonusTrack02.dev
'Android' 카테고리의 글 목록 (4 Page)