brunch

You can make anything
by writing

C.S.Lewis

by Noah Feb 29. 2016

크기에 따라서 자동으로 줄 바꿈 되는 GroupView

Flow Layout

얼마 전에 브런치 키워드 기능을 발표했다.

https://brunch.co.kr/@brunch/10

안드로이드에서 키워드 레이아웃을 만들어야 한다.



그런데 안드로이드 layout 에는 크기에 따라 자동으로 변경되는  layout이 없다. (왜 없는 걸까?)

더 정확히는 wordwrap 형태의 줄 바꿈 레이아웃이 없다.

개발자 사이트에 보여지는 View group 의 subclass


GitHub에서 flow  layout으로 찾아보면 비슷한 layout 들이 나온다. 

https://github.com/search?utf8=%E2%9C%93&q=android+layout&type=Repositories&ref=searchresults



자! 이제 custom  widget을 만들어 보도록 하겠습니다.

1.  ViewGroup을 상속받는  class를 하나 만듭니다.

public class KeywordFixedGridLayout extends ViewGroup {


}


2. xml 에 자기가 원하는 배치를 합니다.

저는 버튼 4개를 넣는  layout.xml을 만들었습니다.


3. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 오버 로딩
자기 자신의 크기를 정합니다.

int heightMode = MeasureSpec.getMode(heightMeasureSpec);

Measure Mode

EXACTLY - 외부에서 이미 크기가 지정되어있음 (match_parent)

AT_MOST - wrap_content 뷰 내부의 크기에 따라 달라진다.

UNSPECIFIED - mode가 정의되지 않음

EXACTLY의 경우는 할게 없지만 AT_MOST 의 경우는 내부의 크기를 정해서 설정해줘야 한다.

이런 식으로 내부의 크기를 미리 계산해서  setMeasuredDimension을 해줬다.



4. protected void layout(boolean changed, int left, int top, int right, int bottom) 오버 로딩

각 각의 child item 의 위치를 정해줍니다.

A 의 위치 0,0 이면 B 의 위치는 0 + A의  가로길이 ,  0C는 B 의 X 좌표 +  가로길이

만약 n번째의 x + w 가 부모 layout 의 width 보다 크다면 줄 바꿈을 하도록 하는 계산이 들어갑니다.

결론.

Xml이  추가되지 않는 custom widget 만드는 건 어렵지는 않다.

하지만 귀찮다.

일단 Git hub 등을 통해서 찾아보시고 없다면 만들어  써보세요.라고 하고 싶네요

도대체 안드로이드 이런 layout 은 왜 없는 걸까요? 

매거진의 이전글 Android Brunch Editor 살펴보기2
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari