안녕하세요

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


페이지 목록

레이블이 UI인 게시물을 표시합니다. 모든 게시물 표시
레이블이 UI인 게시물을 표시합니다. 모든 게시물 표시

2011년 2월 24일 목요일

[안드로이드] selector 사용하기

열심히 아무것도 아니더라도 넣어둬야지!!

Layout
만들면서 Selector라는 것을 이용하면 편하다는 것을 배웠다. 줄창 아이폰, WM 6 어플 개발만 하다보니 생소해서 열심히 삽질중이다.

drawable-hdpi
폴더에 모든 리소스 파일을 넣었다. 
(
버튼 , 버튼 다운, 버튼 노말) 요런 것들을 일일히 Touch 이벤트로 받아와서 각각의 이벤트에 맞춰 이미지를 뿌려주었는데 편한 방법이 있었다. 바로 Selector 사용하는 것이었다.

xml
파일의 내용을 살표 보면 다음과 같이 특이할게 없다.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="
http://schemas.android.com/apk/res/android"> 
     <item android:state_pressed="true" android:drawable="@drawable/btn_main_01_on" /> <!-- pressed -->    
 
     <item android:drawable="@drawable/btn_main_01" /> <!-- default -->
 
</selector>

직관적으로 봐도 알겠으니 별도 설명은 생략하고, 이렇게 만든 XML 파일을 적용시키려면 다음과 같이 하면 된다.
<Button
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/creditcard"
     android:background="@drawable/btn_main_01_selector"
     android:layout_marginLeft="66px"
     />

background
속성에 drawble 버튼에 적용될 selector.xml파일을 링크 시켜주면 에뮬레이터 상에서 실행시키면 반응한다. 후다닥 사용해 것을 권장한다.!

[안드로이드] 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() 사용하면 된다.