안드로이드

안드로이드/이론

[ 안드로이드 ] ViewPager2 안에 WebView 중첩 Swipe 처리

상황 ViewPager2 내에 WebView를 넣었을 때, WebView 안에 배너와 같은 horizonScroll이 가능한 View가 있으면 충돌이 일어난다. 처리 방법 WebView의 Down 터치 이벤트 감지 시 ViewPager의 Swipe 기능 Off WebView의 Up 터치 이벤트 감지 시 ViewPager의 Swipe 기능 On WebView 내에서 OverScroll 감지 시 ViewPager Swipe 기능 On → WebView에서 Down 터치 이벤트가 감지되는 순간 ViewPager에 사용자 액션을 차단하여 터치 이벤트를 WebView 내의 배너(기타 스크롤이 가능한 뷰들)가 가져가도록 하는 것 코드 CustomWebView.kt class CustomWebView : WebVie..

안드로이드/이론

[ 안드로이드 ] WebView 페이지 탐색 처리

Android의 WebView에서 링크를 클릭하면 URL을 처리하는 앱이 실행되는 것이 기본적인 동작이지만, 해당 링크가 WebView 내에서 열리도록 동작을 재정의할 수 있다. 이렇게 하면, WebView 내에서 웹페이지 방문 기록을 통해 사용자가 앞뒤로 페이지 탐색이 가능해진다. Url 실행 처리 1. WebViewClient 연결 사용자가 클릭한 링크를 WebView에서 열려면, setWebViewClient()를 통해 WebView에게 WebViewClient를 제공해야 함 val myWebView: WebView = findViewById(R.id.webview) myWebView.webViewClient = WebViewClient() 이렇게만 해주면 사용자가 클릭한 모든 링크가 WebView..

안드로이드/이론

[ 안드로이드 ] WebView 기본 사용법

WebView 사용법 1. 권한 요청 WebView를 사용하기 위해선 인터넷 권한이 필요 ... 2. 앱에 WebView 추가 xml에서 추가 Activity에서 추가 val myWebView: WebView = findViewById(R.id.webview) myWebView.loadUrl("http://www.example.com") 3. 웹 페이지 로드 loadUrl() url로 로드 val myWebView:WebView = findViewById(R.id.webview) myWebView.loadUrl("http://www.example.com") 로컬에서 로드 val myWebView:WebView = findViewById(R.id.webview) webView.loadUrl("file://..

안드로이드/이론

[ 안드로이드 ] 클릭 가능한 모든 뷰에 반투명 효과 넣기

졸업 작품 앱을 만들던 중 뷰를 클릭했을 때 반투명 효과를 적용하고 싶었다. 단, 클릭 가능한 모든 뷰에 자동으로 적용하고 싶었다. 일일이 xml에서 지정해주는게 아닌 자동으로 할 방법이 없을까를 생각하다가 이 글을 작성하게 되었다. 해당 글에선 TouchListener를 Override 하여 모든 뷰에 클릭 효과를 넣는 방법을 소개한다. TransparentTouchListener.kt 생성 뷰를 클릭했을 때 반투명 효과를 주기 위해 아래와 같이 OnTouchListener를 재정의한다. class TransparentTouchListener( private val onTouchChanged: ((View, MotionEvent) -> Unit)? = null ) : View.OnTouchListene..

안드로이드/이론

[ 안드로이드 ] Retrofit2를 이용하여 서버와 통신하기 (2) - 예시

[ 안드로이드 ] Retrofit2를 이용하여 서버와 통신하기 안드로이드에서 Retrofit2으로 서버와 통신하는 경우가 많은데, 에러 처리를 제대로 해주지 않아 앱이 강제 종료 되는 경우가 많다. 모든 에러를 다 처리해줄 수도 없고, 서버에서 어떤 문제가 발 dongx2.tistory.com 이전 글에서 서버의 요청을 안전하게 처리할 수 있는 방법을 소개했다. 이번 글에선 실제 요청을 보내는 코드 예시를 작성하고자 한다. 일단, 서버로부터 데이터를 받아올 Dto 클래스를 생성하기 위해서 서버의 Api 문서를 확인해야한다. 서버 Api 형식 확인 Dto 클래스를 생성하기 전 서버에서 어떤 형식으로 요청을 받는지, 응답은 어떻게 주는지를 확인해야 한다. 서버의 API Docs (Swagger 등)을 확인하..

안드로이드/이론

[ 안드로이드 ] Retrofit2를 이용하여 서버와 통신하기 (1) - 안전하게 통신하기 (SafeApiCall)

안드로이드에서 Retrofit2으로 서버와 통신하는 경우가 많은데, 에러 처리를 제대로 해주지 않아 앱이 강제 종료 되는 경우가 많다. 모든 에러를 다 처리해줄 수도 없고, 서버에서 어떤 문제가 발생할 지도 모르기 때문에 Retrofit 요청을 안전하게 보내는 방법을 작성하고자 한다. Response를 위한 공통 클래스 작성 안전한 통신을 위해 몇 가지 필요한 작업이 있다. Parcelize 일단 기본적으로 서버에서 받은 응답을 직렬화하기 위해서 Parcelable를 사용한다. @Parcelize는 @Serialize와 비슷한데, 직렬화를 가능하게 해주는 인터페이스인 Parcelable을 구현해주는 어노테이션이다. (Parcelize 설정 방법) 더보기 build.gradle (앱 수준) plugins ..

안드로이드/에러 해결

[ 안드로이드 ] StateFlow 동일한 값 방출(emit)하기

문제 상황 MVVM + 클린 아키텍쳐 형태로 블루투스 기능을 구현하던 도중 StateFlow에 관한 문제가 발생했다. 블루투스 장치가 새로 검색 되어도 StateFlow에서 값이 발행되지 않아 화면에 장치 리스트가 표시 되지 않았다. 처음 한 번만 발행되고 그 이후엔 발행이 안되었는데, 그 이유를 적어보고자 한다. 일단 State 패턴을 이용하여 UI의 State를 관리하는 방식을 사용하고 있는데, Bluetooth 검색 화면의 State 클래스가 아래와 같이 작성 되어 있었다. sealed class BluetoothSearchFragmentState { object Init : BluetoothSearchFragmentState() /.../ data class IsScanning( val scanR..

안드로이드/에러 해결

[ 안드로이드 ] BottomSheet + CoordinatorLayout 테두리 Radius 설정 안먹힐 때

문제 상황 BottomSheetDialogFragment 안에 CoordinatorLayout으로 화면을 구성해둔 상태에서 바텀 시트의 테두리에 Radius 속성을 적용하려했는데 적용되지 않았다. 위의 방법으로 다른 바텀 시트는 다 적용이 잘 되는데 CoordinatorLayout이 들어간 바텀 시트에만 적용이 안되고 있었다. CoordinatorLayout이 바텀 시트를 덮어쓰고 있는 것 같아서 CoordinatLayout의 Radius를 조절해주니까 잘 적용이 된다. 방법은 아래와 같다. 적용 방법 /** * 바텀시트 코너 Radius 지정 */ private fun initCoordinatorLayout(){ bind.coordinatorLayout.outlineProvider = object : ..