2012년 9월 14일 금요일

ScrollView의 길이가 가변일 때 아래에 있는 View(footer)가 잘리거나 안보이는 문제


ScrollView의 부모 View를 LinearLayout, Vertical로 했을 때 단순히 생각하면 그 안에
ImageView(header), ScrollView(contents), ImageView(footer)를 wrap_content로 배치하면 두 ImageView는 보이고 ScrollView가 적절히 조절되어 나올 것 같지만 그렇지 않다.

이는 LinearLayout이 먼저 나오는 뷰의 원하는 사이즈부터 충족시켜 주기 때문인 것으로 보이며 ScrollView는 안의 내용 전체 길이만큼 요구할 것이므로 이후의 ImageView는 LinearLayout 밖으로 밀려나게 된다.

이를 해결하기 위해선 ScrollView에 아래의 속성을 하나 추가하면 된다.
android:layout_weight="1"
layout_weight의 default가 0인데 저것을 1로 해주는 것이 왜 ScrollView의 크기가 적절하게 조절되게 만드는지는 살짝 미스테리(?)하긴 하지만 원인은 시간나면(!) 밝혀 보기로 하고 일단 이렇다는 것만 알아두자.

2012. 1. 12

추가:
오랜 시간이 지나고 댓글을 발견하고 이해가 안가서 좀 찾아봤더니 이런 글이 있었습니다. http://www.soen.kr/book/android/book/book2/3-2-4.htm
간단히 요약하면 0은 사이즈를 나누는 것에 관여하지 않고 자기가 원하는 크기를 가지고 1 이상은 이후 남은 영역을 숫자 비율대로 나눠가진다는 것이네요.
그래서 weight가 0인 스크롤 뷰가 가지고 있는 컨텐츠 전체의 길이만큼 가져가 버려서 이 현상이 생긴것이고 스크롤 뷰의 weight을 1로 하면 0인 이미지뷰들이 먼저 가져가고 남은 영역을 비율대로(여기서는 혼자) 가져가므로 위 아래 이미지뷰가 보일 수 있게 스크롤뷰의 사이즈가 결정되는 것이었습니다.

댓글 2개:

  1. weight를 1로 줌으로써 전체를 view를 1로 본다는 소리가 되지요 그래서 자동으로 적절히 조절이 되는겁니다

    답글삭제
    답글
    1. 댓글 다신지 몇 달이나 지났네요^^; 이 댓글 발견하고 이해가 안가서 좀 찾아봤더니 이런 글이 있었습니다. http://www.soen.kr/book/android/book/book2/3-2-4.htm
      간단히 요약하면 0은 사이즈를 나누는 것에 관여하지 않고 자기가 원하는 크기를 가지고 1 이상은 남은 영역을 숫자 비율대로 나눠가진다는 것이네요. 부연설명은 본문에 추가 하겠습니다.

      삭제