안드로이드 체크박스(CheckBox) 기본 사용법. (How to use an Android Checkbox)

2017. 6. 19. 10:11


1. 안드로이드 CheckBox

컴퓨터의 화면이 텍스트 입출력 방식(CLI, Command Line Interface)에서, 그래픽으로 구성된 요소(Component)를 통해 사용자와 상호작용하는 그래픽 사용 방식(GUI, Graphic User Interface)으로 바뀐 이후로, GUI 프레임워크에 따라 그 구성요소(Component)의 이름 또한 많이 변화되어 왔습니다. 안드로이드에서 문자열 출력을 위해 사용되는 TextView가 어떤 곳에서는 StaticText 또는 Label 등의 이름으로 불리는 것을 예로 들 수 있죠.


하지만 그러한 변화 중에도, 대부분의 주요 GUI 프레임워크 또는 개발 툴에서 동일한 이름을 유지해온 요소가 있습니다. 바로 Button과 CheckBox입니다.


Button은 [안드로이드 버튼 기본 사용법]에서 살펴봤듯이, 사용자가 화면을 터치했을 때 발생하는 클릭 이벤트를 처리하는 기능을 가진 View 위젯입니다. 사실, 이렇게 풀어서 설명하기가 머쓱할 정도로, Button은 컴퓨터를 사용해본 경험이 있는 사람이라면 누구나 알고 있는 화면 구성요소(Component)입니다.


CheckBox 또한 마찬가지입니다. 어디서 맨 처음, 이 "CheckBox(체크박스)"라는 용어를 사용했는지는 모르겠지만, 사용자의 화면 터치(클릭 이벤트)에 따라 "선택됨(checked)" 또는 "선택되지 않음(unchecked)"의 상태를 표시하기 위해 사용되는 구성요소(Component)라는 것을, 컴퓨터 GUI 화면을 사용해본 경험이 있는 사용자라면 거의 대부분 알고 있죠.


이렇듯 오랜 기간 그 이름과 기능을 유지해 온 Button과 CheckBox는 한 가지 공통점을 가지고 있습니다. 그것은 바로 Button과 CheckBox의 기본적인 사용 목적이, 사용자가 화면을 터치했을 때 발생하는 클릭 이벤트를 처리하기 위한 것이라는 겁니다.
반면 두 요소 간 차이점으로서, CheckBox에만 존재하는 특징이 있습니다. 바로 CheckBox는 "선택됨(checked)"과 "선택되지 않음(unchecked)"으로 구분된 두 가지 상태(two-states)를 가진다는 것이죠.


이 공통점과 차이점에 따라, 객체 지향 프로그래밍(Object Oriented Programming) 개념을 적용하면 Button이 CheckBox의 부모가 됩니다. CheckBox의 입장에서, 클릭 이벤트 처리 기능은 Button으로부터 상속받고, 두 가지 상태(two-states) 관리 기능만 새로 추가하면 되는 것입니다.


그런데 안드로이드에서, 클릭 이벤트를 처리함과 동시에 선택과 관련된 두 가지 상태를 가지는 View 위젯이 CheckBox만 있는 것이 아닙니다. 다른 글을 통해 살펴볼 RadioButton, Switch 또는 ToggleButton같은 View 위젯들도 CheckBox와 동일한 특징을 가지고 있습니다. 물론, 그룹 묶음에 의한 배타적(exclusive) 선택 기능이나 화면에 표시되는 모양 차이 등의 세부적인 차이점을 가지고 있지만 말이죠.


그래서 안드로이드에서는, "선택됨(checked)"과 "선택되지 않음(unchecked)"이라는 두 가지 상태가 클릭 이벤트에 의해 자동으로 변경되게 만드는 공통 기능을 가진 CompoundButton이라는 클래스를 추가하고, CheckBox, RadioButton, Switch, ToggleButton을 CompoundButton으로부터 상속받도록 만들었습니다. (이 또한 객체 지향 프로그래밍(Object Oriented Programming) 개념에 기초한 설계의 결과입니다.)


이로써 안드로이드의 버튼 관련 View 위젯들 간 관계는 다음 그림과 같이 구성됩니다.

Button - CompoundButton - CheckBox, RadioButton, Switch, ToggleButton 상속 관계도


CheckBox 클래스 계층 관계도


2. CheckBox 기본 사용법.

TextView 또는 Button처럼, 안드로이드 기본 View 위젯인 CheckBox를 사용하는 방법도 아주 간단합니다.

2.1 Layout 리소스 XML에 CheckBox를 추가하여 화면에 표시.

CheckBox를 화면에 표시하려면, Layout 리소스 XML 파일에 CheckBox를 추가하면 됩니다.

[STEP-1] "activity_main.xml" - Layout 리소스 XML에 CheckBox 추가.
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Check"
        android:id="@+id/check1"/>

CheckBox 표시 화면


2.2 CheckBox 클릭 이벤트 처리.

화면에 표시된 CheckBox에서 발생한 클릭 이벤트를 처리하기 위해서는, CheckBox에 대한 클릭 이벤트 리스너 객체를 생성하여 setOnClickListener() 함수에 전달하면 됩니다. 이는 [안드로이드 버튼 기본 사용법]에서 설명한 Button 클릭 이벤트 처리 방법과 동일한 절차입니다. (클릭 이벤트를 처리하는 여러 가지 방법에 대해서는 [버튼 클릭 이벤트를 처리하는 몇 가지 방법]에서 확인할 수 있습니다.)

[STEP-2] "MainActivity.java" - CheckBox의 클릭 이벤트 처리.
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // ... 코드 계속

        CheckBox checkBox = (CheckBox) findViewById(R.id.check1) ;
        checkBox.setOnClickListener(new CheckBox.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO : process the click event.
            }
        }) ;
    }
}

여기서 한 가지 주의할 점이 있는데, CheckBox의 선택 여부(checked or unchecked)를 변경하기 위해서는 반드시 클릭 이벤트 리스너를 등록해야 하는 것으로 오해하는 경우가 있다는 것입니다. 클릭 이벤트 리스너의 onClick() 함수에서 직접, 선택 여부를 변경해줘야 하는 것으로 말이죠. 하지만 그것은 잘못된 생각입니다.


CheckBox에서 선택 여부(checked or unchecked)는 클릭 이벤트 리스너의 사용 유무와 관계없이 자동으로 처리되도록 이미 구현되어 있습니다. CheckBox의 직접적인 부모 클래스인 CompoundButton에 이미 상태 관리 및 이벤트에 따른 상태 변경 기능이 구현되어 있기 때문에, 특수한 경우를 제외하고 클릭 이벤트에서 CheckBox의 선택 여부(checked or unchecked)를 바꿀 이유가 없죠.


그럼 CheckBox의 클릭 이벤트는 어떤 경우에 사용되는 걸까요?
주로, CheckBox의 선택 여부에 따른 앱의 기능 변경 사항을 사용자에게 실시간으로 알려준다던지, CheckBox 선택 여부에 따라 추가적인 내용을 보여주거나 감추는 기능을 제공할 때 사용됩니다.

2.3 CheckBox 선택 상태 가져오기.

CheckBox를 사용하는 가장 주된 이유는 앱에서 제공하는 기능의 사용 여부를, 사용자로부터 "선택됨(checked)" 또는 "선택되지 안됨(unchecked)"의 형태로 입력받기 위함입니다. 사용자로부터 입력된 선택 상태 값은 Java 코드에서 isChecked() 함수를 사용하여 확인할 수 있습니다.

[STEP-3] "MainActivity.java" - CheckBox 선택 상태 가져오기.
    CheckBox checkBox = (CheckBox) findViewById(R.id.check1) ;
    if (checkBox.isChecked()) {
        // TODO : CheckBox is checked.
    } else {
        // TODO : CheckBox is unchecked.
    }

2.4 CheckBox 선택 상태 변경하기.

앱 시작 시, 또는 앱 실행 중 CheckBox의 선택 상태를 설정하려면, setChecked() 함수를 사용합니다. setChecked() 함수의 파라미터인 boolean 값에 "true"를 전달하면 "선택됨(checked)" 상태로, "false"를 전달하면 "선택되지 않음(unchecked)" 상태로 설정하게 됩니다.

[STEP-4.1] "MainActivity.java" - CheckBox의 setChecked() 함수로 선택 상태 변경하기.
    CheckBox checkBox = (CheckBox) findViewById(R.id.check1) ;

    checkBox.setChecked(true) ; // "선택됨" 상태로 변경. 

setChecked() 함수가, 파라미터로 지정된 값으로 CheckBox의 상태를 설정하는 반면, 현재 CheckBox의 선택 상태를 반대로 설정하도록 만드는 함수도 있습니다. 바로 toggle() 함수 입니다.

[STEP-4.2] "MainActivity.java" - CheckBox의 toggle() 함수로 선택 상태 반전시키기.
    CheckBox checkBox = (CheckBox) findViewById(R.id.check1) ;

    checkBox.toggle() ; // CheckBox의 선택 상태를 반대로 변경

2.5 체크 박스 클릭 이벤트 함수에서 선택 상태 알아내기.

만약 체크 박스(CheckBox)가 클릭되었을 때 클릭 이벤트 핸들러 함수에서 체크 박스(CheckBox)의 선택 여부를 확인하려면, onClick() 함수의 파라미터인 View를 CheckBox로 형변환 한다음, isChecked() 함수를 호출하면 됩니다.

[STEP-5] "MainActivity.java" - 체크박스 선택 시, 선택 상태 확인.
    CheckBox checkBox = (CheckBox) findViewById(R.id.check1) ;
    checkBox.setOnClickListener(new CheckBox.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (((CheckBox)v).isChecked()) {
                // TODO : CheckBox is checked.
            } else {
                // TODO : CheckBox is unchecked.
            }
        }
    }) ;

2.6 앱 실행 시 체크 박스가 자동 선택되도록 만들기.

앱 실행 시, 체크 박스의 최초 선택 여부를 지정하기 위해서는 checked 속성을 사용합니다.

[STEP-6] checked 속성으로 최초 선택 여부 지정.
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Check"
        android:id="@+id/check1"
        android:checked="true" />

CheckBox 기본 선택 화면


3. 참고

.END.


ANDROID 프로그래밍/BUTTON