Flow Layout
얼마 전에 브런치 키워드 기능을 발표했다.
https://brunch.co.kr/@brunch/10
안드로이드에서 키워드 레이아웃을 만들어야 한다.
그런데 안드로이드 layout 에는 크기에 따라 자동으로 변경되는 layout이 없다. (왜 없는 걸까?)
더 정확히는 wordwrap 형태의 줄 바꿈 레이아웃이 없다.
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);
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 은 왜 없는 걸까요?