코디네이터레이아웃 사용해서 스크롤시
툴바 및 리사이클러뷰 스크롤시 최상단 및 최하단 터치 감지가 불량일 때가 있다.
최상단 혹은 최하단 스크롤 후 리스트 항목을 클릭이 되지 않아 두번 클릭해야하는데
안드로이드 sdk 28에서는 정상동작 한다.
이전 버전에서 AppBarLayout.Behavior 에 버그가 있는듯.
android coordinatorlayout recyclerview scroll click
이렇게 검색하니 스택오버플로우에 올라온 글
Click not working on RecyclerView in CoordinatorLayout when scrolling
코틀린 코드만 입력
게시글 중 해당 링크가 있고 수정된 코드 java와 kotlin이 있음.
https://gist.github.com/erikhuizinga/edf408167b46eb5b1568424563ca4e59
kotlin
//////////////////////////////////////////////////////////////////////////////////////////
/**
* Workaround AppBarLayout.Behavior for https://issuetracker.google.com/66996774
*
*
* See https://gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2 for
* example usage.
*
* Kotlinised by Erik Huizinga (github: @erikhuizinga).
*/
class FixAppBarLayoutBehavior(context: Context?, attrs: AttributeSet?) :
AppBarLayout.Behavior(context, attrs) {
override fun onNestedScroll(coordinatorLayout: CoordinatorLayout, child: AppBarLayout,
target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int,
dyUnconsumed: Int, type: Int) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed,
dyUnconsumed, type)
stopNestedScrollIfNeeded(dyUnconsumed, child, target, type)
}
override fun onNestedPreScroll(coordinatorLayout: CoordinatorLayout, child: AppBarLayout,
target: View, dx: Int, dy: Int, consumed: IntArray, type: Int) {
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type)
stopNestedScrollIfNeeded(dy, child, target, type)
}
private fun stopNestedScrollIfNeeded(dy: Int, child: AppBarLayout, target: View, type: Int) {
if (type == ViewCompat.TYPE_NON_TOUCH) {
val currOffset = topAndBottomOffset
if (dy < 0 && currOffset == 0 || dy > 0 && currOffset == -child.totalScrollRange) {
ViewCompat.stopNestedScroll(target, ViewCompat.TYPE_NON_TOUCH)
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////
코드 사용법
AppBarLayout abl = findViewById(R.id.app_bar);
((CoordinatorLayout.LayoutParams) abl.getLayoutParams()).setBehavior(new FixAppBarLayoutBehavior());
xml 사용법
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar"
android:layout_height="..."
android:layout_width="..."
app:layout_behavior="your.package.FixAppBarLayoutBehavior">
</android.support.design.widget.AppBarLayout>
<!-- Content -->
</android.support.design.widget.CoordinatorLayout>
'Kotlin > source code' 카테고리의 다른 글
안드로이드 코틀린 리사이클러뷰 아답터 구글예제 (0) | 2019.04.24 |
---|---|
코틀린 리사이클러뷰 예제. (0) | 2018.10.15 |
코틀린 퍼미션 관련 소스.( 안드로이드 추상 클래스 이용한 퍼미션 권한 설정. 2-2) (0) | 2018.10.08 |