본문 바로가기
코딩일기/android studio

Android 독학 6일차 : CheckBox 이벤트 처리

by 욱파이어니어 2021. 3. 11.
728x90
반응형

체크박스 같은 경우에는 선택된 체크박스에서 값을 받아와야 한다.

 

그래서 내가 이번 체크박스 이벤트 처리에서 만들 것은 이거다.

 

1. 여러개의 체크박스를 만들어서 체크하고 제출 버튼을 클릭하면

체크박스에 찍힌 값이 아래에 있는 TextView에 나오게 하기.

 

2. 제출버튼을 누르면 체크된 것들만 아래의 TextView에 찍히게 하기.

 

3. 취미 사이에는 ' , ' 가 존재해야 하는데 마지막 거에는 ' , ' 가 없어야 한다.

 

그럼 일단 xml 부터 보자

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="좋아하는 취미 생활을 모두 선택하세요"
        android:layout_gravity="center"/>

    <TableLayout
        android:id="@+id/hobbies"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center">

        <TableRow>
            <CheckBox
                android:id="@+id/workout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="헬스"
                android:onClick="checked"/>
            <CheckBox
                android:id="@+id/movie"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="영화"
                android:onClick="checked"/>
            <CheckBox
                android:id="@+id/music"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="음악감상"
                android:onClick="checked"/>
        </TableRow>
    </TableLayout>
    <Button
        android:id="@+id/submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="제출"/>
    <TextView
        android:id="@+id/showHobby"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="나의 취미 : "/>
</LinearLayout>

화면으로 보면 대충 이런 모양이다. 

 

저기서 이제 제출 버튼을 누르게 되면 나의 취미 부분에 적히게 되는 것이다.

 

자 그럼 이제 자바 소스 부분을 보자.

public class MainActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //체크박스들
        CheckBox ch1 = (CheckBox)findViewById(R.id.workout);
        CheckBox ch2 = (CheckBox)findViewById(R.id.movie);
        CheckBox ch3 = (CheckBox)findViewById(R.id.music);
        //제출 버튼
        Button submit = (Button)findViewById(R.id.submit);
        //테이블 레이아웃 (체크박스 값 가져오기 위해)
        TableLayout tl = (TableLayout)findViewById(R.id.hobbies);
        //체크 박스 결과값 받을라고
        TextView showHobbies = (TextView)findViewById(R.id.showHobby);

        //제출 버튼 클릭했을때
        submit.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(),"제출했당~",Toast.LENGTH_SHORT).show();
                //새로 체크되서 받은것
                if(showHobbies.getText().toString().equals(sendCheck(ch1,ch2,ch3))){
                    Toast.makeText(getApplicationContext(),"변함이 없습니다.",Toast.LENGTH_SHORT).show();
                }else{
                    showHobbies.setText(sendCheck(ch1,ch2,ch3));
                }
            }
        });
    }
    private String sendCheck(CheckBox ch1,CheckBox ch2,CheckBox ch3){
        //체크된것들의 값을 받기 위한 변수
        String checked = "";
        if(ch1.isChecked()){
            checked += (ch1.getText().toString()+",");
        }
        if(ch2.isChecked()){
            checked += (ch2.getText().toString()+",");
        }
        if(ch3.isChecked()){
            checked += ch3.getText().toString();
        }
        //마지막 부분에 , 없애기 위해서 ,로 분리
        String[] hArr = checked.split(",");
        
        //리턴할 결과물을 담을 변수
        String result ="";
        
        for(int i = 0;i<hArr.length;i++){
            if(i == hArr.length-1){ //i가 hArr 변수의 마지막 이라면
                result += hArr[i]; // , 를 안붙임
            }else{ //마지막이 아니면 , 붙이기
                result+=(hArr[i]+",");
            }
        }
        return "나의 취미 : "+result;
    }
}

나는 각각의 체크박스들을 id 값으로 가져와서 체크되었는지 안되었는지 확인하기 위해 

sendCheck() 함수의 인자로 넘겼다.

 

sendCheck()에서는 각각의 체크 박스들의 체크 여부를 확인하고 

checked라는 문자열에 담는다.

그리고 담은 문자열을 ' , '로 나눠서 마지막에는 ' , ' 가 들어가지 않게 처리하고 

결과를 넘긴다.

 

그리고 setOnClickListener()에서는 전달받은 결과 값으로 클릭되었을 때 showHobbies의 Text를 바꿔준다.

 

이렇게 해서 체크박스의 이벤트 처리하는 법을 배웠다.

 

체크 박스 처리하는 부분이 html과는 다르게 일일이 체크 박스를 선언 해야해서 조금 당황스러웠다.

그래서 나는 체크 박스들을 일일히 선언하지 않고 하나의 메서드로 모든 체크 박스들의 값에 접근하는 방법을 찾아

보려고 했지만 모든 체크 박스들이 같은 onClick 메서드를 사용하는 것 외에는 방법이 없었다.

(혹시 다른 방법을 알고 계신 분이 있다면 댓글로 알려주시면 감사하겠습니다...)

 

그래서 해당 방법으로 사용하려 했지만 그야말로 onClick 됐을 때 해당 오퍼레이션이 작동을 해서 

해체할 때 클릭되는 것으로도 작동을 해서 해제된 체크박스의 값까지 가져오는 상황이 발생했다.

 

그래서 결국엔 느낀 점은 하나의 화면에서 이벤트 처리를 받을 때는 이벤트 처리받는 뷰들은 모두 선언해야지 해당 뷰에 접근할 수 있구나를 깨달았다.

반응형