안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

2011년 2월 24일 목요일

[안드로이드] Focus 처리

프레임워크는 사용자 입력에 응답하는 일상적인 포커스 움직임을 제어한다.
이것은 뷰가 제거되거나 또는 숨겨질 포커스를 변경하는 것을 포함한다. 뷰는 isFocusable()메소드를 통해 포커스를 가질수 있다.
뷰가 포커스를 가질 있는지 없는지 간에 변하기 위해서 setFocusable() 호출한다. 
포커스 이동은 주어진 방향에서 가장 가깝게 이웃해 있는 것을 찾는데 의도했던 동작과 일치하지 않을때, 레이아웃 파일안에서 nextFocusDown, nextFocusLeft, nextFocusRight, nextFocusUp 같은 XML 애트리뷰트를 사용해서 명시적인 오버라이드를 있다. 포커스가 더나게 되는 뷰에서 애트리뷰트 하나를 추가하고 애트리뷰트의 값에 포커스가 건네져야 하는 뷰의 id 설정한다.


<LINEARLAYOUT .... android:orientation="vertical">
    <BUTTON .... android:nextFocusUp="@+id/bottom"
                            android:id="@+id/top">
    <BUTTON .... android:nextFocusUp="@+id/top"
                           android:id="@+id/bottom">
</LINEARLAYOUT>


보통 이러한 버티컬 레이아웃에서,  번째 버튼은 위로 움직이면 갈데가 없고, 두번째 버튼은 아래로 움직이면 갈데가 없다. 
번째 버튼은 nextFocusUp으로 아래 버튼을 정의했고, 번째는 nextFocusDown으로 정의하여, 네비게이션의 포커스는 위에서 아래로 부터 아래에서 위로 사이클을 돌게 된다.
만약, UI에서 포커스 가능한 뷰를 선언하고 싶다면 레이아웃 선에 android:focusable XML 애트리뷰트를 추가하고 값을 true 설정하면 된다. 
또한, android:focusableInTouch Mode 사용해서 터치모드 동안에도 포코스 가능한 뷰를 선언할 있다.

특정 뷰가 포커스를 가지도록 하기 위해서는 requestFocus() 호출하면 된다. 
포커스 이벤트를 캐취하려면 이벤트 리스너의 onFocusChange() 사용하면 된다.



댓글 없음:

댓글 쓰기