기존에 작성한 [로그인폼 만들기](https://devyurim.github.io/2018/01/17/8.html) 에서는 입력을 위해 키보드를 띄웠을때 버튼이 가려지는 단점이 있었다. 따라서 ScrollView를 적용하여 이런 단점을 보완하였다.



1. activity_login.xml 파일 수정

일단 res -> layout -> activity_login.xml 파일에서 아래의 레이아웃 구조처럼 수정하였다.


스크롤 뷰(ScrollView)에 관한 기본적인 attribute를 보면 다음과 같다.


  • scrollbarStyle

    안드로이드에서 지원하는 스크롤바 스타일에는 4가지가 존재한다.

스타일
기능
insideOverlay Padding 추가 없이 내용물의 안쪽에 스크롤바를 배치한다.
스크롤 바가 내용물 위에 투명하게 올라간다.
insideInset Padding을 추가하고 패딩영역에 스크롤바를 배치한다.
스크롤 바가 내용물에 오버랩되지 않는다.
outsideOverlay Padding 추가 없이 스크롤바를 화면 가장자리에 배치한다.
스크롤 바가 내용물 위에 투명하게 올라간다.
outsideInset Padding을 추가하고 스크롤바를 화면 가장자리에 배치한다.
스크롤 바가 내용물에 오버랩되지 않는다.

원하는 스크롤바 스타일을 골라서 설정해 주면 된다. 나는 OutsideOverlay를 사용하였다.

  • style

스크롤바 스타일도 여러종류를 선택 할 수 있다. 선택지는 다음과 같다. 지금 현재 필요한 기능은 아닌거 같아서 default로 사용하였다.



  • fillViewport

fillViewport 항목은 True일 때 내용물의 크기가 화면을 넘어가도 알아서 내용물의 크기만큼 뷰가 확장이 된다. False이면 내용물의 크기가 화면밖으로 넘어가도 보이지 않게 된다. 따라서 스크롤 뷰 fillViewport 적용시 스크롤 뷰의 height는 자식 뷰에 있는 콘텐츠 길이에 따라 결정되 기 때문에 자식뷰의 match_parent의 속성은 적용될 수 없다.

  • clipToPadding

clipToPadding은 스크롤의 오작동 없이 뷰( scrollView, listView, gridView )에 padding 값을 주고 싶을 때 조절할 수 있는 항목이다.
( 디폴트 값은 True이다 )

패딩을 주는 이유는 뷰의 맨 마지막 요소가 다른 뷰에 오버랩 되어 가려지기 때문인데 해당 뷰에 패딩을 주게 되면 스크롤이 패딩이 적용된 안쪽에서만 작동하는 오류가 생기게 된다. 그렇기 때문에 해당 뷰 위아래에 header 와 footer를 추가하는 방법도 있지만 clipToPadding 항목을 False로 사용하면 쉽게 해결된다.

이제 키보드가 올라와도 양식이 자동으로 위로 밀려서 버튼이 겹치지 않는다!