본문 바로가기

Android/Button State

Android Button Status test

Button의 상태에 따라 버튼의 배경이미지 변경하기

Android에서 Button은 다음과 같은 3가지 상태를 갖는다.
Normal, Focused, Pressed

Normal 상태 : Focused 상태도 아니고 Pressed 상태도 아닌 경우, 혹은 의미상 모든 경우라고도 할 수 있음
Focused 상태 : track ball이나 입력패드 등을 이용하여 버튼을 가리키고 있는 경우
Pressed 상태 : 버튼이 현재 눌린 경우

위의 3가지 상태를 XML 파일에 선언하고 각 상태마다 버튼위에 나타낼 이미지를 지정해 놓으면 쉽게 버튼의 상태에 따른 배경 이미지를 변경할 수 있다.

다음은 Google 에서 인용한 예제이다.
사용된 이미지


android_button.xml (res/drawable 혹은 res/layout 안에 파일을 저장한다)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   
<item android:drawable="@drawable/android_pressed" android:state_pressed="true" />
   
<item android:drawable="@drawable/android_focused" android:state_focused="true" />
   
<item android:drawable="@drawable/android_normal" />
</selector>


여기서 주의할 점은 Normal 상태란 의미적으로 모든 경우를 의미하므로 상태를 선언할 경우에 가장 마지막에 선언되어야 한다는 것이다. 프로그래밍 언어의 IF 제어문을 구성하는 else 부분과 같고, SWITCH CASE문장의 마지막에 오는 default 부분과 같은 맥락으로 이해해야 한다. 예를 들어, SWITCH CASE문장의 가장 처음에 default 부분이 오게 된다면 무조건 그 부분이 실행될 것이다. 위의 파일에서 가장 아래에 위치한 item 엘리먼트를 가장 위로 옮긴다면 버튼이 어떤 상태에 있던지 상관 없이 항상 android_norml.png 이미지가 버튼에 고정되어 나타날 것이다. 즉, 상태변화에 반응할 수 없는 버튼이 될 것이다.

res/layout/main.xml

     .....
    <Button
       
android:id="@+id/button"
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content"
       
android:padding="10dp"
       
android:background="@drawable/android_button" />
     .....