졸업 작품 앱을 만들던 중 뷰를 클릭했을 때 반투명 효과를 적용하고 싶었다. 단, 클릭 가능한 모든 뷰에 자동으로 적용하고 싶었다. 일일이 xml에서 지정해주는게 아닌 자동으로 할 방법이 없을까를 생각하다가 이 글을 작성하게 되었다. 해당 글에선 TouchListener를 Override 하여 모든 뷰에 클릭 효과를 넣는 방법을 소개한다. TransparentTouchListener.kt 생성 뷰를 클릭했을 때 반투명 효과를 주기 위해 아래와 같이 OnTouchListener를 재정의한다. class TransparentTouchListener( private val onTouchChanged: ((View, MotionEvent) -> Unit)? = null ) : View.OnTouchListene..
[ 안드로이드 ] Retrofit2를 이용하여 서버와 통신하기 안드로이드에서 Retrofit2으로 서버와 통신하는 경우가 많은데, 에러 처리를 제대로 해주지 않아 앱이 강제 종료 되는 경우가 많다. 모든 에러를 다 처리해줄 수도 없고, 서버에서 어떤 문제가 발 dongx2.tistory.com 이전 글에서 서버의 요청을 안전하게 처리할 수 있는 방법을 소개했다. 이번 글에선 실제 요청을 보내는 코드 예시를 작성하고자 한다. 일단, 서버로부터 데이터를 받아올 Dto 클래스를 생성하기 위해서 서버의 Api 문서를 확인해야한다. 서버 Api 형식 확인 Dto 클래스를 생성하기 전 서버에서 어떤 형식으로 요청을 받는지, 응답은 어떻게 주는지를 확인해야 한다. 서버의 API Docs (Swagger 등)을 확인하..
안드로이드에서 Retrofit2으로 서버와 통신하는 경우가 많은데, 에러 처리를 제대로 해주지 않아 앱이 강제 종료 되는 경우가 많다. 모든 에러를 다 처리해줄 수도 없고, 서버에서 어떤 문제가 발생할 지도 모르기 때문에 Retrofit 요청을 안전하게 보내는 방법을 작성하고자 한다. Response를 위한 공통 클래스 작성 안전한 통신을 위해 몇 가지 필요한 작업이 있다. Parcelize 일단 기본적으로 서버에서 받은 응답을 직렬화하기 위해서 Parcelable를 사용한다. @Parcelize는 @Serialize와 비슷한데, 직렬화를 가능하게 해주는 인터페이스인 Parcelable을 구현해주는 어노테이션이다. (Parcelize 설정 방법) 더보기 build.gradle (앱 수준) plugins ..
문제 상황 MVVM + 클린 아키텍쳐 형태로 블루투스 기능을 구현하던 도중 StateFlow에 관한 문제가 발생했다. 블루투스 장치가 새로 검색 되어도 StateFlow에서 값이 발행되지 않아 화면에 장치 리스트가 표시 되지 않았다. 처음 한 번만 발행되고 그 이후엔 발행이 안되었는데, 그 이유를 적어보고자 한다. 일단 State 패턴을 이용하여 UI의 State를 관리하는 방식을 사용하고 있는데, Bluetooth 검색 화면의 State 클래스가 아래와 같이 작성 되어 있었다. sealed class BluetoothSearchFragmentState { object Init : BluetoothSearchFragmentState() /.../ data class IsScanning( val scanR..
문제 상황 BottomSheetDialogFragment 안에 CoordinatorLayout으로 화면을 구성해둔 상태에서 바텀 시트의 테두리에 Radius 속성을 적용하려했는데 적용되지 않았다. 위의 방법으로 다른 바텀 시트는 다 적용이 잘 되는데 CoordinatorLayout이 들어간 바텀 시트에만 적용이 안되고 있었다. CoordinatorLayout이 바텀 시트를 덮어쓰고 있는 것 같아서 CoordinatLayout의 Radius를 조절해주니까 잘 적용이 된다. 방법은 아래와 같다. 적용 방법 /** * 바텀시트 코너 Radius 지정 */ private fun initCoordinatorLayout(){ bind.coordinatorLayout.outlineProvider = object : ..
에러 상황 [ 안드로이드 ] RecylcerView + Filterable을 이용하여 실시간 검색 기능 구현하기 졸업 작품을 진행하면서 위와 같은 화면을 구현해야했다. 약품 리스트를 받아와서, 검색한 단어와 일치한 모든 약품들을 보여줘야했다. 추가로 일치하는 단어에는 하이라이팅까지 해줘야했다. dongx2.tistory.com 이전에 위와 같은 화면을 구현하는 방법을 포스팅 했었는데, 위의 기능을 구현하면서 발생했던 에러에 대해서 적어보고자 한다. 에러 로그 검색을 하는 도중에 Incosistency detected. Invalid item postion ~~ 에러가 발생하면서 앱이 죽는 문제가 발생했다. 대충 어떤 부분에서 에러가 나는지 짐작은 되는데 정확히는 모르겠다. 이번 에러의 원인은 두 가지인 ..
[ 안드로이드 ] 제목 DAO DAO는 인터페이스(interface)나 추상 클래스(abstract)로 정의할 수 있다. 안드로이드 공식 문서에 따르면 일반적으로는 인터페이스로 사용하라고 권장하고 있다. DAO 인터페이스 (또는 추상 클래스)에는 무조건 @Dao 어노테이션을 선언해주어야 한다. Retrofit의 Service와 매우 유사하기 때문에 많이 익숙한 형태이다. @Dao interface MedicineDao { @Insert fun insert(medicine: Medicine) @Insert fun insertAll(medicines: List) @Update fun update(medicine: Medicine) @Delete fun delete(medicine: Medicine) @Que..
졸업 작품을 진행하면서 위와 같은 화면을 구현해야했다. 약품 리스트를 받아와서, 검색한 단어와 일치한 모든 약품들을 보여줘야했다. 추가로 일치하는 단어에는 하이라이팅까지 해줘야했다. 위의 화면에서 지켜져야 할 조건들은 아래와 같다. 전체 약품 리스트를 미리 갖고 있어야한다. 입력을 감지해서 실시간으로 결과를 출력할 것이기 때문에, 속도나 서버 부하 측면에서 매번 서버로 요청을 보낼 수 없다. 미리 전체 약품 리스트를 받아와서 변수로 저장해둔 후 사용해야한다. 일치하는 단어는 하이라이팅으로 표시해줘야 한다. Spannable을 이용해서 TextView의 색상을 조절해주면 된다. 약품 검색 화면 xml 작성 먼저 화면을 작성해준다. 나같은 경우에는 약품을 선택했을 때 해시태그처럼 상단에 추가되게 할 예정이었..