목록Android (57)
Hanbit the Developer
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/znokA/btrH1AkuVqE/WavB0Kq1QrXk0exE678vtk/img.jpg)
배경 안드로이드에서 Multiple Image Picker를 구현하려면 직접 구현해야만 합니다. TedPicker 같이 매우 좋은 라이브러리가 이미 나와있으나, 저 같은 경우에는 진행중인 프로젝트의 디자인 통일성을 위해 구현의 길을 택하게 되었습니다😅 이 글에서 이러한 커스텀 ImagePicker의 구현을 핵심 위주로 설명하고자 합니다. 미리 보는 결과물은 다음과 같습니다. 기본적으로 MVVM 아키텍처 및 Jetpack Navigation을 사용하였습니다. 구현 해야할 것은 대략 다음과 같습니다. 0. 권한 요청 처리 1. ImagePickerFragment 2. Item 정의 3. ViewModel 구현(⭐️) 4. RecyclerView 구현 및 ViewModel 연결 5. 선택한 사진을 외부 프래그..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/58KAf/btrHuS8wqtj/kxkEU1bQ5roLK9k6OLdPn1/img.png)
배경 저의 경우, BottomNavigationView로 나뉘는 각 item에서의 기능이 매우 상이하고 상호간 의존성도 없어서 아래와 같이 모듈화를 진행하였습니다. 이에 따라 각 item으로 fragment가 아니라 navigation을 두어야 했고, 이에 따라 일반적인 bottom navigation view와는 다른 구현을 했어야 했습니다. 구현 nav_home.xml 가 아니라, 내비게이션을 include해야 합니다. menu_home.xml 메뉴 item 또한 내비게이션을 참조합니다. NavBottomNavigationView.kt class NavBottomNavigationView: BottomNavigationView { constructor(context: Context): super(co..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/czefDi/btrGE3aW6dS/QdkxawYVbJWik8LSOKAv2K/img.png)
배경 필자가 aar 파일을 사용하고자 하였으나 'Error building Android library: Direct local .aar file dependencies are not supported' 같은 오류가 발생하여 방법을 찾아봐도 해결이 쉽지 않았습니다. 이 글에선 어떻게 aar 라이브러리를 추가하는지 알아보겠습니다. 모듈 추가 aar 파일을 포함하는 폴더 하나를 만들어서 모듈로서 import 해야합니다. 이를 위해 저는 libs라는 폴더를 바탕화면에 생성했고 이 폴더 내에 aar 파일을 추가하였습니다. 또, build.gradle 파일을 이 폴더 내부에 생성해준 뒤, 아래와 같은 내용을 넣어줍니다. configurations.maybeCreate("default") artifacts.add(..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/eLnz2K/btrGg15LRWG/7wfE9tszRtY2Wlz1549aA1/img.png)
서론 결과 미리보기 배경 개발을 하다보면 여러 개의 Recycler View를 만들게 되어 프로젝트 구조가 복잡해지기 마련입니다. 또한 위 사진처럼 하나의 Recycler View에 여러 타입의 뷰를 띄워야 하는 경우도 있습니다. 예를 들면, 네이버 카페 어플에서 글을 본다고 할 때, 사진+제목, 제목, 광고와 같은 타입으로 아이템이 나눠질 수 있습니다. 여기서 각 Recycler View의 아이템들을 여러 타입으로 분류하여 RecyclerView.Adapter를 상속하는 CommonAdapter 클래스 하나만으로 구현하는 방법을 알아보겠습니다. 먼저 서버단에서 데이터를 어떻게 보내야 할지를 정의해야 합니다. data는 CommonItem이라는 객체의 리스트를 담고 있습니다. CommonItem은 Rec..
https://charlezz.medium.com/jvm-dvm-art-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-c51d10dc56e3 JVM, DVM, ART 이해하기 안드로이드를 처음 막 배우기 시작한 꼬꼬마시절 왜 구글이 왜 자바를 선택했고, 자바의 바이트코드가 무엇이며, 왜 폰에서 Dalvik과 ART를 선택하라는 거지??? charlezz.medium.com
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/KhVS9/btrw8NQrbXy/FKmN2Qx2LXQXdrhZCya77k/img.gif)
Before get started, be aware of that this post contains only about the 'custom layout manager' which means overrided LinearLayoutManager by programmers, not about a recycler view moving like a carousel. If you want to implement the recycler view, I refer to my other post explaining it: https://rccode.tistory.com/entry/Kotlin-Profile-Card-RecyclerView-With-PagerSnapHelper [Kotlin] Carousel Recycl..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/7ekeC/btrsY8pP4aU/4bJyTNlMfnKVV2Lg3uAzY1/img.png)
서론 안드로이드 어플을 구현하다보면, 뷰와 데이터 간의 일관성을 위해 의존성을 주입하거나 로직을 복잡하게 만들어야 하는 경우가 상당히 많았다. 하지만, 데이터바인딩을 사용하면 뷰에 들어가는 값이 항상 뷰모델의 값과 일치하게 하도록 할 수 있다. 값을 임의로 증가시켜도 뷰를 따로 업데이트해줄 필요가 없다. 게다가 뷰모델은 액티비티나 프래그먼트의 수명주기 전체를 scope로 두기 때문에, 화면을 회전하는 등의 행위가 있어도 따로 신경쓰지 않아도 된다. 그리고 데이터바인딩 라이브러리를 이용하면, 뷰의 클릭 이벤트(setOnClickListener)를 액티비티나 프래그먼트 클래스 파일 내에 지정하지 않아도 된다. xml 파일 내에 클릭 이벤트를 지정해줄 수 있기 때문이다. 액티비티 구성 맨 위는 +, - 버튼을..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/lfoi6/btrqmNogpqk/OakpoTR7MfOUkIZe18Esw0/img.png)
> VideoView에 영상을 넣는 방법 get request에 대해 video를 response하는 url이 있다고 해보자. 이 때 VideoView에 이 링크의 영상을 띄우고자 할 때, 두 옵션이 있다. 첫번째는 Retrofit2를 이용하여 url에 get request를 보내 response를 얻어온 뒤, 이것의 바이너리를 임시 파일로 만들고 이 파일의 uri(Uri.fromFile())를 setVideoURI의 인자로 전달해주는 방법이다. 두번째는 영상 url를 setVideoPath나 setVideoURI의 인자로 넣어주는 방법이다. 이 때 후자의 경우, Uri.parse()를 이용하여 url을 uri로 바꾸는 과정이 필요하다. 하지만 이 두 방법은 완전히 동일하다. 왜냐하면, VideoView..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bamsg9/btrppyM6hAB/WENLskJStCvP9KaNNDgkSk/img.png)
> Layouts - Add padding to recycler view so that you can see a part of the adjacent items. - In the item, set width to match_parent > Recycler view acting like view pager2 - Just use PagerSnapHelper snapHelper = PagerSnapHelper() snapHelper.attachToRecyclerView(YOUR_RECYCLER_VIEW) > Add button in last index of recycler view - Add 'add_button_item.xml' which contains: - Divide view holder into tw..
It's simple. Just use some parameters as Unit type, and invoke them. First, make your custom api calling function as below: fun enqueueApiCall( call: Call, onResponse: (Response)->Unit, onFailure: ()->Unit ){ call.enqueue(object: Callback { override fun onResponse(call: Call, response: Response) { onResponse.innoke() } override fun onFailure(call: Call, t: Throwable) { onFailure.invoke() } }) } ..