Android 75

커스텀 이미지피커 [+페이징,앨범] (10, 11 대응)

보통 이미지피커는 라이브러리를 사용했었다 ( 편하니까.. ) 클라이언트가 아래와 같은 UI를 원한다. 처음에 전체 이미지들이 나오고 전체보기를 눌렀을때 앨범들이 나온다 앨범을 누르면 그 앨범에 해당하는 이미지들이 나온다 ( 그러면 다시 전체보기를 할수 없다. 전체보기 앨범이 없기 때문에 ) 시안대로. 사실 커서로 이미지를 가져온다는 개념은 알고있었으나 해보지 않았기 때문에 미지의 영역이었다. 처음엔 사용했었던 이미지피커를 import 해서 UI만 바꾸려고 했으나 이번기회에 학습해보고 싶어 밑바닥부터 구현했다. 일단 참고한 라이브러리는 TedImagePicker, Pickle 페이징 쿼리 리스트 DataBinding TedImagePicker X 쿼리 미사용 ( 모든 이미지 항목들에 대해 필터링 ) Seq..

Android 2021.09.07

[Refactoring] 여러개의 CheckBox -> Rx 핸들링

상품등록시 이런 형태의 UI 에서 Rx Subject + LiveData 처리 하는 방법 -> 해당 아이템이 선택됐을때를 Subject 으로 묶는게 최종 목적 private val _onDealTypeChanged: Subject 1. (기존) 체크박스에 CheckedChangeListener를 연결하여 뷰모델에서 combineLatest 로 묶는 방법 @BindingAdapter("checkedChanges") fun CheckBox.bindCheckedChanges(subject: Subject) { this.setOnCheckedChangeListener { _, isChecked -> subject.onNext(isChecked) } } Observable.combineLatest( _onDire..

Android 2021.08.05

Grid 격자 테두리 그리기(onDraw in RecyclerView.ItemDecoration)

RecyclerView.ItemDecoration 에서 onDraw 를 이용하여 직접 아이템에 대해 그리는 방법 아래와 같은 GridLayout 을 만들려고 한다. 고려해야할점 각 아이템 항목마다 회색 Stroke 맨왼쪽 아이템은 왼쪽에 뚫려져 있음 + 맨 오른쪽 아이템은 오른쪽이 뚫려져 있음 단순히 하나의 아이템 레이아웃에 사각형의 Stroke를 background로 지정하면 중간선들이 겹쳐보이는 현상이 있음 Stroke만큼의 padding 을 줘야함 RecyclerViewAdapter의 onBindViewHolder에서 맨 왼쪽과 맨 오른쪽인 경우 View를 숨겨야함 cf) 숨기는 코드 Sample override fun onBindViewHolder(holder: BaseViewHolder, pos..

Android 2021.07.04

TroubleShooting With AppbarLayout expand

요구조건 1. 아래로 스크롤시 툴바가 투명해지면서 오른쪽에 썸네일이 보임 2. 아래로 스크롤시 탑으로 가는 버튼 생성 -> 탑으로 이동 3. 스크롤시 탭 레이아웃이 툴바 밑에 고정 상품 상세화면 구조 샘플 ... private val appBarOnOffScrollListener: AppBarLayout.OnOffsetChangedListener by lazy { AppBarLayout.OnOffsetChangedListener { _, verticalOffset -> with(viewDataBinding) { if (ctlLayout.height + verticalOffset < 2 * ViewCompat.getMinimumHeight(ctlLayout)) { // collapsed (아래로 스크롤 했..

Android 2021.06.06

상품리스트 - 좋아요 - 툴팁 - 트러블 슈팅

환경 : MVVM + 리사이클러뷰 + 데이터바인딩 + DiffUtil 요구 조건 : 상품 리스트에서 좋아요를 눌렀을때 툴팁이 2초동안 보이게 해주세요! - 툴팁 보여주기 animate() 를 이용 tvTooltip.apply { alpha = 1f animate() .alpha(1f) .setDuration(2_000L) .setListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator?) { alpha = 0f } }) } 처음에 툴팁 TextView의 alpha 값을 0으로 설정후 좋아요 버튼을 누르면 alpha: 1로 변경, 2초후에 alpha: 0으로 변경 구현 좋아요 버튼 클릭 -> Vi..

Android 2021.06.05

비동기 함수 - Rx로 변경하기

1. Single ( 한번 받기 ) 예제 : FirebaseMessage의 token 받기 기본 var token : String fun getInstanceId(){ Firebase.messaging.token .addOnCompleteListener { token = it.result } } 이렇게 하면 함수형이 아니게 된다. 그래서 Single.create로 변환 override fun getInstanceId(): Single { return Single.create { emitter -> Firebase.messaging.token .addOnCompleteListener { task -> when (task.isSuccessful) { true -> task.result?.let { emitt..

Android 2021.05.14

웹뷰 스크롤 전파

CoordinatorLayout -> ViewPager -> Fragment 가 웹뷰를 가지고 있다. 그러면 웹뷰를 스크롤하면 ViewPager의 app:layout_behavior="@string/appbar_scrolling_view_behavior" 이 동작하지 않는다. (단지 웹뷰만 스크롤 될뿐이다.) 그래서 웹뷰가 스크롤될때 상황에 따라 상위 뷰에 전파하기 가 필요하다 아래의 코드는 NestedScrollWebView 라이브러리를 커스텀 했다 (NestedScrollingChild3 로 변형하여 ) 웹뷰 프레그먼트 레이아웃 class NestedScrollWebView @JvmOverloads constructor( context: Context?, attrs: AttributeSet? = nu..

Android 2021.04.03

Map vs FlatMap

리스트 변환 연산자 map 과 flatMap의 차이와 활용 방법에 대한 정리 (1) map : iterator()로 각 아이템 꺼내옴 -> 변형 -> 방출 (2) flatMap : iterator() 로 아이템 하나씩 꺼내옴 -> 새로운 리스트로 변형 -> 방출 map은 익히 알고 있는 for문과 동일하기 때문에 이해하기 쉬운데 flatMap은 문서만 보고선 도저히 이해하기 어렵다. ( 개념이 와닿지가 않는다. flat하게 만든다는게 무슨말이지? ) 실 예로 flatMap 이해하기 1. 리스트 2배로 변형 fun main() { val list = listOf( Cat(1, "naong"), Cat(2, "persian"), Cat(3, "sham") ) //고양이 2배로 증식하기 val new = li..

Android 2021.04.01