Android

    [Android] ViewTreeObserver를 이용하여 View가 그려지는 시점을 알아보자! (getWidth(), getHeight()의 출력값이 0인 경우..)

    ViewTreeObserver View의 높이를 구하기 위해, onCreate() 콜백 메서드에서 getHeight() 혹은 getMeasuredHeight()를 호출하면 0이 반환되곤 합니다. 그 이유는 높이를 얻고자 하는 View가 아직 화면에 그려지기 이전에 호출했기 때문입니다. ViewTreeObserver를 알기 전에는 자바에서는 Thread, 코틀린에서는 Coroutine을 사용하여 n MS(Millisecond) 만큼 시간이 지났을 때 높이를 얻으라고 했을 것입니다. 하지만 이런 방식은 View가 그려진 정확한 시점을 알지 못하기 때문에, n MS라는 시간 안에 View를 그리지 못하는 상황이나 기기 스펙에서는 똑같이 0을 반환하는 시간차 문제가 발생할 것입니다. 그렇기 때문에 알아야하는 것..

    [Android] 자바 코틀린 (Pattern, Matcher)정규식을 사용하여 패스워드 조건을 만들어보자

    동아리 프로젝트 중, 비밀번호 변경을 구현하는 단계에서 정규식을 사용할 일이 생겼습니다. 조건은 '영문, 숫자, 특수문자 중 2개를 사용하여 최소 8자리 이상'의 비밀번호를 입력해야 합니다. 자바와 코틀린에서는 기본적으로 Pattern과 Matcher라는 정규식 라이브러리 클래스를 제공합니다. 이번 포스팅에서는 해당 클래스의 사용방법에 대해 알아보고 직접 비밀번호에 적용해보도록 하겠습니다. Pattern - Pattern 클래스 주요 메서드 compile(String regex) : 주어진 정규표현식으로부터 패턴을 만듭니다. matcher(CharSequence input) : 대상 문자열이 패턴과 일치할 경우 true를 반환합니다. asPredicate() : 문자열을 일치시키는 데 사용할 수있는 술어..

    [Android] 안드로이드 Strings.xml 국가별 언어 설정 방법 및 국가 코드 정리

    개발을 하다 보면, Android, ios 상관없이 다국어화를 해야 하는 경우가 발생하곤 합니다. 한국에서 중국어나 일본어로 된 앱을 잘 사용하지 않듯이, 본인의 모국어에 맞추어 화면에 텍스트를 보여줄 필요가 있습니다. 이번 시간에는 다양한 국가에서 앱을 사용하기 편하도록 설정하는 다국어 설정을 해보겠습니다. 우선 위 사진을 살펴보면, values와 values-ko 두 가지가 있습니다. values의 경우 우리가 처음 안드로이드 프로젝트를 실행하면 자동으로 생성되는 폴더로, 어떠한 나라에서든지 Default로 사용되는 폴더입니다. 그 아래를 보면 values-ko라는 폴더가 보이는데, 이는 한국어로 설정한 기기에서 앱을 실행했을 때 사용될 폴더입니다. 이처럼 특정 국가의 언어를 지정하고 싶으면, 국가 ..

    [Android] RecyclerView LayoutPosition vs AdapterPosition 차이를 알아보자!

    개발을 하던 중, RecyclerViewAdapter를 구현해야 하는 상황이 생겼습니다. 그러다 문득 ViewHolder 내부 메서드를 살펴보았는데, 이 중 position을 반환하는 함수가 정말 다양하다는 사실을 알게 되었습니다. 그럼 position을 반환하는 많은 메서드 중에서, 과연 무슨 함수를 사용해야 하는 것일까? 한 번 차근차근 살펴보도록 하겠습니다! /** * @deprecated This method is deprecated because its meaning is ambiguous due to the async * handling of adapter updates. You should use {@link #getLayoutPosition()} or * {@link #getAdapterP..

    [Android] MVVM ViewModel 오류 : Can't access ViewModels from detached fragment 해결방법!

    MVVM 패턴을 기반으로 프로젝트를 진행하던 중, 아래와 같은 오류가 발생하였습니다. JNI DETECTED ERROR IN APPLICATION: JNI FindClass called with pending exception java.lang.IllegalStateException: Can't access ViewModels from detached fragment Detached된 Fragment에서 ViewModel에 접근할 수 없다는 내용인데요... 무슨 뜻인지 해석했음에도 불구하고 몇 시간의 삽질을 해야만 했습니다..ㅎㅎ 곰곰이 생각해보니 Android Lifecycle을 조금만 생각해봤다면 금방 해결했을텐데 말이죠.. 😅 어떤 코드에서 오류가 발생하였는지 함께 살펴보겠습니다. 🎈 class M..

    [Android][1] MVVM패턴 Databinding 맛보기!

    * 본 내용은 스스로 학습한 내용을 정리한 게시글입니다. * 데이터바인딩(DataBinding)이란? 기존에는 레이아웃의 뷰를 참조하기 위해서는 아래와 같이 findViewById() 메서드를 사용하였다. val button: Button = findViewById(R.id.my_button) 하지만 이러한 방식은 같은 한 화면에는 여러 개의 뷰가 존재하는 액티비티 클래스에 동일한 메서드를 너무나도 많이 호출시키게 만들어 클린 코드에 적합하지 못하다고 판단하였다. 그래서 등장하게 된 것이 바로 데이터바인딩(DataBinding)이다. 데이터바인딩을 사용했을 때의 장점 1. findViewById를 연속적으로 사용할 필요 없이 binding 객체 하나만 있으면 뷰를 참조할 수 있다. 2. RecyclerV..

    [Android][어따세워] 음성인식으로 주차장을 검색해보자! STT(Speech To Text) SpeechRecognizer

    이번 포스팅에서는 계속해서 '어따세워' 프로젝트의 구현 파트를 다뤄볼 것이다. 주차장을 리스트를 검색할 때, 주차장 명을 직접 타이핑하여 검색할 수도 있겠지만, 사용자의 편의를 위해 음성인식 검색까지 구현해보고자 하였다. (실행 결과는 코드 맨 아래에 있습니다.) . . . 우선 음성인식 기능을 구현하기 위해서 Manifest에 RECORD_AUDIO 권한을 추가해주어야 한다. binding.searchBarContainer.voiceButton.setOnClickListener { PermissionHelper.checkRecordPermission(this@SearchActivity) { // 권한 승인된 상태라면 openVoiceDialog() // 음성인식 다이얼로그 오픈 } } @Suppress..

    [Android] startActivityForResult() depreacted 해결 : ActivityResultContracts

    토이 프로젝트를 진행하던 중 startActivityForResult를 사용할 일이 생겨 onActivityResult와 함께 오버라이드를 한 결과... 위 사진과 같이 deprecated 되어 더 이상 지원하지 않는다는 것을 알게 되었다. 조금 더 자세히 알아보니 2020년 5월 기준으로 deprecated 되었다고 한다. 사라진 이유는 프로젝트 규모가 커질수록 onActivityResult 메소드 안에 들어가는 코드의 양이 늘어나기 때문이다. 예를 들어, onActivityResult 메소드에서 requestCode에 따라 분기를 나누어 로직을 수행하는데, 그 안에서도 조건에 따라 분기가 나뉘면 클린 코드에서 점점 멀어지게 될 것이다. 이러한 문제를 해결하기 위해서 ActivityResultContr..

    [Android][어따세워] 토이 프로젝트 주제 정하기

    계기 최근에 최고의 IT 서비스 기업인 네카라쿠배의 채용공고만 보아도 안드로이드 직군에서 MVVM, Coroutine, RxJava, Kotlin은 기본 및 우대사항으로 기재되어 있다. 이런 기술 스택을 보면서 안드로이드를 공부하며 '내가 배우고 있는 내용을 프로젝트와 접목'시켜 시너지를 높여보고 싶었고, 이론뿐만 아니라 실무적인 부분에서도 적용하고 싶은 마음이 커지게 되어 시작하게 되었다. 또한, 기업에서는 혼자 개발하는 것이 아닌, 여러 개발자끼리 '협업'을 할 텐데, 지금까지 1인 개발만 해온 스스로를 더욱 성장시켜주고 싶었다. 주제 아이디어 회의를 하며 떠올린 토픽은 '어따세워' 라는 주차 앱이다. 본인과 지인 모두 군대를 무사 전역하고 슬슬 운전을 시작하기 시작했는데, 초보운전이어서 그런 것인지..

    [Android][0] MVVM 패턴이란?

    * 본 내용은 스스로 학습한 내용을 정리한 게시글입니다. * 오늘부터 Android의 MVVM 패턴에 대하여 정리해보려고 한다. 이미 기존에 대략 공부를 해보긴 했지만, 지식이 너무 얇팍하고 부족함을 느껴 글로 정리해보려고 한다. MVVM 패턴을 사용해야 하는 이유 기존에 Android 앱을 개발하다보면 Activity 하나에 모든 기능을 쏟아붓고 방치해두다가, 며칠 지나서 수정할 일이 생겨 프로젝트를 열어보면 내가 작성한거지만 무슨 용도로 해놓은 메소드인지, 클래스인지 구분하기 어려울 정도로 체계적이지 않았다. 그러다보니 기능 추가 및 수정시 다시 소스코드를 분석해야 하므로 시간이 오래 소요되는 불필요한 상황이 만들어진다. 이런 코드를 흔히 스파게티 코드(spaghetti code)라고 부른다. (코드..