ScrollView에서 내부 View변경시 스크롤이 이동되는 현상

|

API를 보면 애초에 구글이 의도한건 ScrollView 안에 심플한 View만 넣어 사용하도록(TextView나 ImageView등) 의도한것 같은데,

실제 사용하다보면 그게 안되는게 함정....


흔하게 ScrollView안에 ListView가 있는 경우도 있고, (eclipse에서 warning...)

ScrollView안에 또 ScrollView가 있는 경우도 있고....

뭐 이런저런 복잡한경우가 많은데....


내 경우엔,

ScrollView안에 TabView가 있는데,

Tab이동시 스크롤 위치가 제멋대로....


ScrollView 맨 위로 이동하는경우도 있고, TabView의 컨텐츠가 보이도록 위치하는경우도 있고....


그리고 ScrollView안에 ListView를 위치한 경우, ListView의 LayoutParams를 변경하면 ListView가 보여지도록 이동하는 경우도 있더랬다.


코드에서 제어하는 부분 마지막에 scrollTo()를 써도 적용이 되지 않아 로그로 확인해보니

실제 스크롤이 이동되는 시점은 사용자의 코드가 끝난 이후 시점.



그래서...

프레임웍상의 ScrollView 클래스에 실제 스크롤을 이동하는 메소드(뭐였지...)에 로그를 찍어 확인해보니....



내부 View를 변경하는 다양한 경우에 따라 호출이 되거나 되지않는 메소드가 하나 있더라.


그게 requestChildFocus();


인자로 두개를 받는데,

영어가 부족한 나로썬 좀 헷깔린다...

첫번째 인자는 "포커스를 받기 원하는 child"

두번째 인자는 "실제 포커스를 받으려는 child의 desendent(자손)...."


의미가 좀 애매하다...

첫번째 인자는 바로붙은 child인가....


근데 ScrollView는 바로 아래의 child를 하나만 가질 수 있기때문에... 궂이 줄 필요가 없을텐데.....


어쨌든간에... 실제 사용할땐 첫번째 인자에 null을 주고, 두번째 인자에 서브 뷰 상에 가장 상단에 위치한 뷰를 넘겼더니

스크롤이 가장 상단으로 이동한다. (가장 상단에 있는 뷰가 포커스를 요청하니 스크롤은 가장 상단으로...)


인자에 대해서는 좀 더 보야아 할 듯...




어쨌든 해결책은 requestChildFocus()


And