반응형

 라디오 버튼은 옵션이나 설문지 등 복수개의 선택지 중에서 하나를 선택할 때 사용하는 위젯이다. 

하지만 원하는 라디오 버튼에 체크를 해도 화면을 전환하거나 앱을 종료하게되면 체크했던 라디오 버튼이

해제되는 문제점이 있다. 설문지 같은 단순히 체크 후 제출하는 식의 라디오 버튼은 상태를 저장할 필요까진

없지만, 환경설정 같은 옵션 체크는 체크 후에 상태가 항상 유지되어야하기 때문에 체크 상태 저장이 필요하다.

 

 이렇게 상태를 저장하기위해 사용하는게  'SharedPreferences'이다. 

이 SharedPreferences는 앱 안에 파일을 하나 생성하고 그 안에 데이터를 저장해서 앱 재실행 시 데이터들을 복원할 수

있게 해주는데, 이번 시간에는 라디오 버튼 체크 상태를 이 파일 안에 저장 및 복원해서 상태를 유지하는 방법을

알아보도록 하겠다.  

 

 저번 시간에는 라디오 버튼을 라디오 그룹 안에 배치를 해서 처리를 했지만, 이번 시간에는 '컴파운드 버튼(CompoundButton)' 클래스로 된 라디오 버튼을 처리해보도록 할 것이다. 

 

 그런데 CompoundButton이란 무엇인가? 

Button 클래스의 하위 클래스 및 4가지 버튼들의 상위 클래스로, 그 하위 목록에는 '체크박스(Check Box)',

'토글 버튼(Toggle Button)', '라디오 버튼(Radio Button)', '스위치(Switch)'가 있고, 리스너로 OnCheckedChangeListener()를 추가로 사용할 수 있다.  

 

 

 이제 코드로 알아보자.

두 개의 라디오 버튼을 만들고, 각 버튼을 누른 상태에서 앱을 재실행시키게되면 최근에 선택했던 버튼이 저장되어

그 상태를 유지할 수 있도록하는 코드이다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
autoBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean auto_isChecked) {
                Toast.makeText(getApplicationContext(), "메모가 자동으로 저장됩니다. ", Toast.LENGTH_SHORT).show();
            }
        });
 
        manualBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean manual_isChecked) {
                Toast.makeText(getApplicationContext(), "메모가 수동으로 저장됩니다. (저장버튼 활성화) ", Toast.LENGTH_SHORT).show();
            }
        });
cs

 이렇게 각각의 버튼을 누를 때마다 각각의 처리를 기술하면된다. 

 

여기까지만 하면 체크 상태 저장은 되지 않는다. SharedPreferences를 이용해서 별도의 메소드를 만들어야한다. 

 

1
2
3
4
5
6
7
8
9
10
11
 private void RadioStateSave(String key, boolean value) {
        SharedPreferences sharedPreferences = getSharedPreferences("radio_State", MODE_PRIVATE); // "radio_state"라는 이름으로 파일생성, MODE_PRIVATE는 자기 앱에서만 사용하도록 설정하는 기본값
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean(key, value); // 키와 값을 boolean으로 저장
       editor.apply(); // 실제로 저장
    }
 
    private boolean UpdateState(String key) {
        SharedPreferences sharedPreferences = getSharedPreferences("radio_State", MODE_PRIVATE);
        return sharedPreferences.getBoolean(key, false);
    }
cs

 

위와 같이 저장 및 복원 메소드들을 만들었고, 이 메소드들을 onCreate()에서 다음과 같이 호출해주면 상태를 복원할 수가 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
autoBtn.setChecked(UpdateState("auto"));
        manualBtn.setChecked(UpdateState("manual"));
 
        autoBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean auto_isChecked) {
                RadioStateSave("auto", auto_isChecked);
                Toast.makeText(getApplicationContext(), "메모가 자동으로 저장됩니다. ", Toast.LENGTH_SHORT).show();
                saveBtn.setVisible(true);
            }
        });
 
        manualBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean manual_isChecked) {
                RadioStateSave("manual", manual_isChecked);
                Toast.makeText(getApplicationContext(), "메모가 수동으로 저장됩니다. (저장버튼 활성화) ", Toast.LENGTH_SHORT).show();
                saveBtn.setVisible(false);
            }
        });
cs

피드백은 언제나 환영입니다. 

반응형

+ Recent posts