본문 바로가기
Android 개발/RecyclerView, List

View가 크기변화를 감지하도록 하는 방법 (addOnLayoutChangeListener)

by Developer88 2017. 7. 26.
반응형

리스트뷰가 들어간 앱을 만들다 보면, 키보드가 위로 올라오는 경우,

화면사이즈가 줄어들어서 전체 리스트 뷰의 아이템이 다 보이도록 해야합니다.


대부분의 경우는 Manifest에서,

android:windowSoftInputMode="adjustResize" 를 설정해줌으로 전체 화면사이즈가 줄어들어 해결되지만,

경우에 따라서 키보드가 올라갈 경우에는 특정 View를 보이지 않도록 하는 경우도 있습니다.


이 때는 키보드가 올라가면서, 화면의 사이즈가 줄어들었다는 것을 감지하여,

그 여부에 따라서, 특정 View의 visiblity를 조절해주면 됩니다.


오늘은, RecyclerView가 화면사이즈 변화를 감지하여서,

그 변화에 따라서 특정 뷰를 보이지 않도록 하는 방법에 대해서 정리해 보도록 하겠습니다.


참고로 ViewTreeObserver를 통해서도, 키보드가 올라왔는지의 여부에 대해서 알 수 있는데요.

이 부분에 대해서는 아래링크를 참조해 주세요.

>>> Keyboard 가 보이는지 알수 있게 해주는 ViewTreeObserver <<<



1. Manifest 설정


가장 먼저 해야할 일은, 키보드가 올라가면 화면이 줄어들고,

내려가면 전체 사이즈가 커질수 있도록 windowSoftInputMode를 adjustResize로 설정해주는 것입니다.




2. RecyclerView에 addOnLayoutChangeListener


기본적인 RecyclerView 세팅에 대해서는 이글에서 다루지 않겠습니다.

(RecyclerView의 기본에 대해서는 아래 링크를 참조해 주세요.)

>>> RecyclerView 로 listview 정복 <<<



RecyclerView에는 레이아웃의 변화를 감지할 수 있는 리스너를 달 수 있는데요.

그 리스너가 바로 addOnLayoutChangeListener입니다.


화면에서 볼 수 있듯이 정말 다양한 인자들을 우리게 주는데요.

여기서 가장 눈여겨 볼 것은 bottom과 oldBottom입니다.

만약 bottom이 oldBottom에 비해서 줄어들었다면,

키보드가 올라왔다고 가정해 볼 수 있겠습니다. 

(물론, 여러가지 상황에 따라 다르지만, EditText와 RecyclerView만 있는 경우의 기준입니다.)


따라서, 아래와 같이 bottom < oldBottom일 경우에, mFrameWrapper를 않보이도록 하고, 

키보드가 내려갔을때는 mFrameWrapper를 보이도록 해줄 수 있겠습니다.




개인적으로는, ViewTreeObserver를 가지고, 화면변화를 감지한다음,

handler에 postDelayed()메소드를 주는 것보다는 훨씬 부드럽게 동작하는 것을 느낄 수 있었습니다.


마지막으로 addOnLayoutChangeListener의 소스코드를 보고 가겠습니다.

뷰의 바운드가 변화될때 불려지는 콜백리스너를 추가해주는 메소드라는 설명이 보이네요~.




참고로, removeLayoutChangeListener 메소드도 있으므로, 경우에 따라서 memoryLeak을 방지하기 위해 사용하는 것도 좋을 것 같네요.


728x90

댓글