분류 전체보기 15

안드로이드 접근성 - 대체 텍스트를 적용해보자!

📱 접근성이란 모바일 접근성이란 웹 접근성과 같은 개념으로 장애를 가진 사람이든 일반인이든 구애를 받지 않고 동등하게 정보에 접근할 수 있도록 설계하고 디자인/개발하는 것을 의미한다. 즉, 모두에게 유용하게 사용되는 앱이 되기 위해서는 접근성 처리가 필요하다. 안드로이드에서는 “TalkBack”, “시인성 향상”, “청각보조” 등 다양한 방법으로 접근성을 제공하고 있는데 이번 글에서는 그 중에서도 대체 텍스트(talkback)를 통해 음성 피드백을 제공할 수 있는 방법을 알아보겠다. ꈍꈊꈍ 🗣 TalkBack이란? TalkBack은 Android 기기에 포함된 Google 스크린 리더입니다. TalkBack을 사용하면 기기를 보지 않고도 제어할 수 있습니다. 출처: https://support.googl..

Android 2022.11.22

InputFilter로 입력값을 제어해보자! (feat. 이모지만 입력받기)

사이드 프로젝트를 진행하던 중 한 가지 문제가 생겼다. 테마별 지도를 주제로 하는 앱이어서 지도를 생성할 때 그 지도의 테마를 잘 나타낼 수 있는 이모지를 등록해야 하는데 만약 사용자가 이모지가 아닌 다른 텍스트를 입력할 경우 앱의 의도와 디자인이 와장창 깨지기 때문에 이모지만 입력할 수 있도록 제재가 필요했다. 🥸 이모지 키보드만 보여주고 싶었지만.. 그래서 inputType=“number” 같은 속성을 사용해서 숫자 키보드만 보여주고, 입력도 숫자만 받을 수 있는 것처럼 이모지 키보드만 보여주고 싶었는데... 인생은 절대 호락호락하지 않지. EditText의 속성 중에 이모지만 보여주거나 입력할 수 있는 속성은 없었다.. ㅇ

Android/UI(XML) 2022.11.10

안드로이드 저장소 권한의 변화와 새롭게 등장한 Photo Picker!

프로필 사진 변경, SNS 피드 작성 등 모바일 앱에서 사진을 가져오는 기능은 정말 많이 쓰이는 것 같다. 내가 지금 하고 있는 사이드 프로젝트에서도 사진을 가져오는 기능이 있어서 안드로이드 EXTERNAL_STORAGE_READ 권한이 필요했다. 그런데 권한 동의를 해고 권한이 부여되었다고 판단되지 않았다! 안드로이드 10 이상의 기기에서만 이런 상황이 발생했는데, 이에 대해 알아보던 중 “Permissionless is the future of Storage on Android” 라는 아티클을 발견했고 이 글에서 약간의 힌트와 Photo Picker라는 새로운 툴에 대해 알 수 있었다. 💀 기존 storage 권한 지원 중단 많은 사용자들이 외부 저장소 접근 권한에 대해서 앱이 어떤 파일에 접근하려는..

Android 2022.10.27

Android 그림자 살펴보기

🌚 그림자 그거 그냥 넣으면 되는거 아닌가? ㅋㅋ 프로젝트를 하다보면 디자이너들이 화면에 그림자를 적용해달라고 하는 경우가 꽤 많다. 그런데 그림자를 코드로 커스텀할 수 있는 iOS와 달리 안드로이드에서는 elevation 속성을 사용해서 깊이감을 주는 것 외에는 그림자를 따로 커스텀할 수 있는 방법이 없어서 보통 9-patch 이미지를 만들어서 사용한다. ( ɵ̥̥ ˑ̫ ɵ̥̥) 참고) iOS & Android: UI 디자인 - DesignCompass 9-patch 이미지가 하나의 리소스로 여러 사이즈의 View에 대응할 수 있다는 장점 때문에 주로 사용되는 것 같은데, 단점도 있다. 그림자로 표시될 부분의 간격 조절에 신경을 많이 써야하고, 또 View 마다 이미지를 뒤에 깔아주는 것이기 때문에 오..

Android/UI(XML) 2022.10.13

Rx 말고, Flow로 다중클릭 방지하기 (throttleFirst)

🤔 고민의 시작 기존의 RxJava를 사용했던 코드들을 Flow로 교체하다가 막힌 부분이 바로 throttleFirst()이다. 다중클릭 방지 등을 위해서는 일정 시간동안 들어온 값 중에서 가장 첫번째 것만 발행하고 나머지는 무시하는 RxJava의 throttleFirst()연산자가 필요한데, Flow에서는 해당 기능의 연산자를 지원하지 않는다. 그래서 이 연산자를 직접 구현해보기로 했다. 🆖 기존 RxJava를 사용한 다중클릭 방지 코드 private fun View.setRxBindingClicks() { this.clicks() .throttleFirst(1000, TimeUnit.MILLISECONDS) .subscribe { onClick(id) } .addTo(disposeBag) } priv..

Android/Coroutine 2022.09.25