ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android TV에서 RecyclerView Focus Loss 현상 해결?
    안드로이드/흐름 2022. 5. 30. 15:15

    최근 개발을 하면서 가장 해결하기 어려웠던 과제 중 하나였다.

     

    RecyclerView에서 오른쪽으로 Long Click을 통해 스크롤을 할 시 

    requestLayout() improperly called by View during layout: running second layout pass
    requestLayout() improperly called by View during layout: posting in next frame

    (View 자리는 requestLayout이 부적절하게 불린 View의 Id로 채워진다. )

     

    해당하는 오류가 생겼고, 그 오류가 처음 발생한건, Glide를 통해 Image를 Focus에 따라 바꿔줌에 있어서 발생하였다.

    또, TextView에 대한 marquee 설정을 Focus에 따라 변경하는 과정에서 해당 오류가 또 발생했다.

     

    처음에는 Glide 이미지에 초점을 맞춰 preload()와 같이 미리 이미지를 생성해주는 기법으로 해결하려고 했으나 실패.

    또한, TextView에도 같은 문제가 발생되면서, 롱 클릭시 버벅거림을 해결할 수 없었고, 이에 며칠을 고민했다.

     

    그러던 와중에 일반 클릭시에도 가끔 해당 문제가 발생하는 것과, 공통적인 현상이 Focus가 바로 오른쪽으로 이동하지 않는 점을 확인해 Focus가 이동 전 View가 생성되지 않음으로써 Focus가 이동하는 것에 대해서 문제가 생기지 않았을까? 하는 생각을 했고, Focus loss 관련해서 열심히 검색을 해봤다.

     

    그리고 TV에서 내가 겪고 있던 문제와 동일한 문제에 대한 해결책이 있었고, 해당 해결책을 공유하고자 한다.

     

    https://intrepidgeeks.com/tutorial/long-press-and-hold-the-tv-segment-recyclerview-to-make-the-item-focus-confused-or-lost

     

    TV단 RecyclerView를 길게 누르면 item 초점이 흐트러지거나 분실됩니다.

    How to Convert an Android App to iOS Wisely? 4-Step Process with Recommendations The app tried to experiment with feature-set, designs, and even concept, but the product was completely ready and had positive feedback based on thousands of downloads, then i

    intrepidgeeks.com

    가장 큰 해결책은 LinearLayoutManager에 있는 onInterceptFocusSearch 함수이다. 이 함수는 Focus에 대해서 FocusFinder가 활동하기 전의 초기 포커스를 가져올 수 있다.

     

    여기서 해결책으로 제시한 건, 단순하다.

    "현재 포커스된 아이템의 위치가 현재 View에서 마지막으로 보이는 위치에 있는 아이템보다 앞서있다면, 현재 포커스된 아이템의 위치로 스크롤을 시켜준다 "

     

    이렇게 했을 때, 내가 생각해본 이 로직의 흐름은,

    1. 실제 포커스를 이동하기 위해 Long Click을 한다면 포커스는 자동으로 이동하려 할 것이다.

    2. 이동 시 해당 로직에 대해서 현재 View에서 가장 끝에 있는 아이템보다 현재 포커스하고 싶은 아이템이 항상 앞서려할 것이다.

    3. 그렇게 되면 scrollToPosition이 수행되며, View가 생성된 후에 Scroll을 수행할 것이고, 그럼으로 인해서 requestLayout()이 부적절하게 호출되는 현상이 없어지면서, 항상 생성 후 Scroll을 할 것이기 때문에 버벅거림 또한 사라지게 될 것이다.

     

    이렇게 해당 로직을 분석했고, 그 결과 나름(?) 자연스러운 스크롤을 개발하게 됐다.

     

    여기서 좀 더 알아봐야할 점은

     

    1. 왜 오른쪽, 아래로 갈 때만 해당 현상이 발생했는가.

     

    2. 오른쪽 버튼 단일 클릭에 대해서 포커스가 바로 이동하는 것이 아닌 Scroll을 먼저 해서 동작 상 자연스럽지 않은 점은 어떻게 해결할 것인가.

     

     

     

    댓글

android, kerriganlove, successful