Android Studio

[Android] NestedScrollView auto scroll bug

i-moo 2018. 2. 12. 14:29
반응형

오랜만에 남기고 싶은 글이 있어서 돌아왔습니다.


이번에 하고 있는 프로젝트에서 NestedScrollView를 많이 사용하고 있는데요!


NestedScrollView와 별개로 외부 뷰에서 EditText를 gone해주어야 하는 부분이 있었습니다.


뷰는 정확히 나누어져 있고, 부모 레이아웃이 RelativeLayout로 되어 있고 따로 연결해놓은 것도 없는데


EditText를 gone만 해주면 스크롤이 내려가는 현상을 보였습니다.


코드를 아무리 보고 수정해봐도 나아지지 않더라구요.


키보드를 올렸다 내렸다 하는 부분에서 충돌나는 건지. Recyclerview의 adapter와 충돌나는 건지.


EditText에 requestFocus를 해주는 부분이 있고, gone해주면서 focus가 풀리니. focus 문제라는 것을 인식했습니다.


NestedScrollView에 강제로 포커스를 줘보고 EditText에 포커스를 풀어줘봐도 같은 문제를 가지고 있었고,


자동으로 스크롤 되버리는 NestedScrollView를 보기 시작했습니다.


그러다가 보게 된 descendantFocusability 속성!


https://developer.android.com/reference/android/view/ViewGroup.html#attr_android:descendantFocusability


Defines the relationship between the ViewGroup and its descendants when looking for a View to take focus. 


포커스를 가져올 뷰를 찾을 때 ViewGroup과 그 자손 사이의 관계를 정의합니다. 


현재 developer사이트에 나와있는 내용입니다.


화면에서 EditText가 가지고 있던 focus를 갑자기 없애버리니 기존에 있는 뷰에 focus를 주어야 되는 상황인데요. 


그 때 자식뷰에게 어떻게 focus를 할 것인지 지정해줄 수 있는 속성입니다.


속성 값은 총 3개로 되어있습니다.


afterDescendants : 하위 그룹이 원하는 경우에만 ViewGroup이 포커스를받습니다.


beforeDescendants : ViewGroup은 자손보다 먼저 포커스를받습니다.


blocksDescendants : ViewGroup은 자손이 포커스를받지 못하도록 차단합니다.


현재 NestedScrollView의 자동스크롤 문제는 blocksDescendants로 속성값을 처리해주면 해결되는 것을 확인할 수 있습니다.


이 속성은 NestedScrollView의 child view에 적용해주면 됩니다. (NestedScrollView나 RecyclerView 에 적용시키는 것이 아닙니다.)


혹시 수정이 필요한 내용이 있으면 댓글로 남겨주시면 확인 후에 수정하도록 하겠습니다.

반응형