Android BottomNavigationView Uncheck All Items
·
Dev experience/Android
이번에는 BottomNavigationView의 모든 아이템이 선택되지 않은 상태로 만들어보려고 한다. 이 동작을 구현하게 된 배경은 BottomNavigationView와 FloatingActionButton을 같이 사용하기 위함이었다. FloatingActionButton(줄여서 FAB라 부르겠다)을 BottomAppBar 안에 cradle 모드로 anchor 시키며 사용하던 중, FAB를 눌렀을 때 다른 프래그먼트가 보여야하므로 이 때 BottomNavigationView(줄여서 BNV)의 다른 모든 아이템이 선택된 상태로 있으면 안됐다. BNV의 모든 아이템을 선택되지 않은 상태로 만들기 위해 여러 사이트를 돌아다니다 짧은 해결법을 찾았다. 일단 나는 코틀린을 사용하고 있어서 확장함수 형태로 구현..
Android DialogFragment Button Text Size(텍스트 크기 조절)
·
Dev experience/Android
DialogFragment를 사용하던 중 Positive, Negative Button의 텍스트 사이즈 조절이 필요해졌다. DialogFragment에서는 onCreateDialog에서 AlertDialog.Builder가 create한 AlertDialog를 리턴하는데 create 이전에 간단한 다이얼로그 생성하듯 setTitle, setMessage, setPositiveButton 등을 호출한다. 나는 여기서 setPositiveButtonTextSize와 같은 메소드가 있을 줄 알았지만 없었다. (그러니깐 이 글을 쓰고 있겠지만) 아래는 onCreateDialog 메소드를 사용한 gist이다. https://gist.github.com/BonusTrack02/a22f1ef8c29dae79e6fca..
Android RecyclerView ItemDecoration in Kotlin
·
Dev experience/Android
내가 이 클래스를 사용하게 된 이유 내가 사용하던 RecyclerView에는 각 아이템 하단에 구분선(Divider)이 있다. 이전에는 해당 아이템을 구성하는 xml에 MaterialDivider를 배치했었다. 새로운 요구사항이 들어오면서 구조 변경의 필요성을 느끼게 되었다. 새로운 요구사항은 마지막 아이템은 구분선이 가로 전체를 차지하도록 변경하는 것이었다. 새로운 요구사항에 따른 시도 RecyclerView Adapter의 onBindViewHolder에서 마지막 아이템을 확인해서 AttributeSet을 다시 할당해주었다. 나름 그럴싸한 로직이라 생각했다.(내 기준) 그 결과, 알 수 없는 버그들이 밀려들어왔다. 처음 adapter를 할당했을 땐 마지막 아이템에만 해당 AttributSet이 적용되..
Codelab으로 Room 알아보기 - 2. Create the SleepNight entity(ㄴ)
·
Dev experience/Android
Step 1. Create the SleepNight entity 이번 과제에서는 하룻밤 수면을 데이터베이스 엔티티를 의미하는 annotated data class로 정의한다. 하룻밤의 수면을 위해서는 시작 시간, 종료 시간, 퀄리티 등급을 기록해야 한다. 그리고 하룻밤을 구분하기 위해 고유 아이디가 필요하다. 1. database 패키지의 SleepNight.kt 파일을 연다. 2. SleepNight 데이터 클래스를 id, 시작 시간(millisecond 단위), 종료 시간(millisecond 단위), 숫자의 수면 퀄리티 등급 파라미터를 사용해 만든다. 품질 데이터가 수집되지 않았다는 것을 나타내기 위해 sleepQuality를 -1로 초기화해야 한다. 시작 시간을 유효한 시간으로 초기화한다. 선택..
Codelab으로 Room 알아보기 - 2. Create the SleepNight entity(ㄱ)
·
Dev experience/Android
안드로이드에서 데이터는 데이터 클래스로 표현된다. 이 데이터는 함수 호출에 의해 접근되고 수정될 수도 있다. 그러나, 데이터베이스 세계에서는 데이터에 접근하고 수정하기 위해서는 entity와 query가 필요하다. 엔티티는 속성과 함께 데이터베이스에 저장할 객체나 개념을 의미한다. 우리의 앱 코드에서 테이블을 정의하는 entity class가 필요하다. 해당 클래스의 각 인스턴스는 해당 테이블의 행을 의미한다. Entity class는 데이터베이스의 정보를 표시하고 상호 작용하는 방법을 Room에 알려주는 맵핑이 있다. 우리 앱에서 엔티티는 하룻밤 수면에 관한 정보를 가지고 있을 것이다. 쿼리는 테이블(혹은 테이블 조합)의 정보 또는 데이터 요청이거나 데이터에 대한 작업을 수행하기 위한 요청이다. 일반적..
Android Notification Max Count
·
Dev experience/Android
저번 Notification 글에 이어 이번 글은 알림 최대 갯수에 관한 포스팅이다. 글을 시작하기 앞서, 여러 자료를 통해 확인한 부분도 있고 내가 수동으로 테스트를 통해 직접 확인한 부분도 있다.물론 확인되지 않은 부분도 있다. (이런 부분은 계속 짚고 넘어갈 예정이다.) 알림 최대 갯수라고 해서 헷갈릴 수 있는데 앱마다(?) 백그라운드에서 알림이 누적되는 최대치가 있다.(사실 앱마다인건지 해당 알림의 channelId마다인 지는 정확하지 않다) 아무튼 알림이 누적되는 양이 제한되는데 갤럭시 플래그십 라인업은 24개가 대부분이다. (OS 10 이상) 회사에서 Pixel폰으로 테스트해보았을 때는 50개였다.(스택오버플로우에서 찾은 구글 소스 코드 원본도 50개가 최대치이다.) 특정 폰에서는 10개까지만..
Android Notification 누적시키기
·
Dev experience/Android
상용 앱들을 보면 어떤 푸시 알림이 왔을 때 해당 푸시가 누적되는 경우가 다반사이다. 하지만, 나는 해당 기능에 대해 구현할 생각을 해본 적이 없었다. 이 때, 갑자기 회사에서 '푸시가 1개밖에 안 쌓여요. 푸시가 누적되게 해주세요.' 라는 요청을 받았다. 기존 코드 notificationManager.notify(0, notificationBuilderCompat.build()) 이 상황에서는 무조건 0번 id로만 notify하기 때문에 새로운 푸시 내용이 도착해도 기존 푸시가 갱신된다. 해결한 코드 notificationManager.notify((System.currentTimeMillis() / 500).toInt(), notificationBuilderCompat.build()) 이렇게 코드를 ..
Codelab으로 Room 알아보기 - 1. Download and inspect the starter app
·
Dev experience/Android
이번에는 드디어 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 Notification channel 설정이 적용안되는 경우
·
Dev experience/Android
나의 상황 출시 초기 버전에서 생성한 Notification channel에는 mp3파일로 소리 설정이 되어있었고, 진동은 설정값이 없었다. 이번에 진동을 설정하고 소리를 변경하기 위해서 검색하다보니 OS 8.0 이상의 경우, Notification channel에 소리와 진동 설정을 해줘야 했다. 나는 여러 글에서 찾은 방법으로 코드를 구성했고 앱을 실행했지만 소리와 진동 설정은 정상적으로 되지 않았다. 해결법 앱을 삭제 후 재설치하거나 앱 데이터를 삭제한 뒤 재실행한다. 개인적인 추론 Android Developer 사이트에서 힌트를 찾아볼 수 있었다. 진동 설정을 위해 찾아본 메소드에 이런 내용이 있다. 마지막 줄에 보면 NotificationChannel이 create되는 메소드에 전달되기 전까지..
Codelab으로 LiveData transform해보기 - 3. 정리(完)
·
Dev experience/Android
Transforming LiveData LiveData에 transformation을 하고 싶다면 Transformations 클래스의 helper 메소드들을 사용한다. Transformations.map 메소드는 LiveData에 데이터를 변경하고 다른 LiveData 객체를 리턴해준다. Displaying the result of a transformation in a TextView 원본 데이터가 ViewModel의 LiveData로 정의되어 있는지 확인한다. 변수를 정의한다. 어떤 변수가 있다면 Transformations.map 메소드로 transformation을 수행하고 그 값을 변수에 리턴해준다. val newResult = Transformations.map(someLiveData) { ..