Switch SharedPreference 에 대한 질문입니다.

조회수 850회
            Switch _Gain_Switch = (Switch)_Adjust_Popup.FindViewById(Resource.Id._Gain_Switch);
            SeekBar _Gain_SeekBar = (SeekBar)_Adjust_Popup.FindViewById(Resource.Id._Gain_SeekBar);
            TextView _Gain_SeekBar_Text = (TextView)_Adjust_Popup.FindViewById(Resource.Id._Gain_SeekBar_Text);


            _Gain_SeekBar.Enabled = _Saved_Data.GetBoolean("_Test_SSS", true);
            _Gain_Switch.Checked = _Saved_Data.GetBoolean("_Test_SSS", true);
            _Gain_SeekBar.Progress = _Saved_Data.GetInt("_Test_Pro", 0);
            _Gain_SeekBar_Text.Text = "" + _Saved_Data.GetInt("_Test_Pro", 0);

            _Gain_Switch.CheckedChange += (a, b) =>
            {
                if (b.IsChecked == true)
                {
                    _Gain_SeekBar.Enabled = true;

                    _Data_Edit.PutBoolean("_Test_SSS", true);
                    _Data_Edit.Apply();

                    _Gain_SeekBar.Progress = _Saved_Data.GetInt("_Test_Pro", 0);
                    _Gain_SeekBar_Text.Text = "" + _Saved_Data.GetInt("_Test_Pro", 0);
                    _Gain_SeekBar.ProgressChanged += (c, d) =>
                    {
                        _Gain_SeekBar_Text.Text = string.Format("" + d.Progress);

                        _Data_Edit.PutInt("_Test_Pro", d.Progress);
                        _Data_Edit.Apply();
                    };
                }

                else if (b.IsChecked == false)
                {
                    Toast.MakeText(this, "Auto 를 선택하셨습니다", ToastLength.Short).Show();
                    _Gain_SeekBar.Enabled = false;
                    _Gain_SeekBar_Text.Enabled = false;

                    _Data_Edit.PutBoolean("_Test_SSS", false);
                    _Data_Edit.Apply();
                }
            };

현재 이런 상황입니다. 제가 질문드리고 싶은건, Switch 현 상태를 저장해서 불러오는 것은 알겠습니다만, Switch 내부에 데이터까지 한번에 저장해서 불러오는 방법은 없나요?

예를 들어, Switch = true 상태를 Shared에 저장해서 재실행 했을 때도 true를 불러오면, true 안에서 실행되는 TextView의 수정이라던가 SeekBar의 표현이라던가를 같이 불러오는 방법은 없나요?

잘 이해가 안가신다고 하여, 내용을 추가하겠습니다.

현재는 Switch문 밖에

            if (_Saved_Data.GetBoolean("_Test_SSS", true) == true)
            {
                _Gain_SeekBar.Progress = _Saved_Data.GetInt("_Test_Pro", 0);
                _Gain_SeekBar_Text.Text = "" + _Saved_Data.GetInt("_Test_Pro", 0);
            }
            else if(_Saved_Data.GetBoolean("_Test_SSS", true) == false)
            {
                _Gain_SeekBar.Enabled = false;
                _Gain_SeekBar_Text.Enabled = false;
            }

이 문장을 추가하여 True가 저장되었을 때와 False가 저장되었을 때 각각 이벤트를 정해주었습니다.

좀 더 구체적으로 예를 들자면

위에 문장처럼

"_Test_SSS" 이라는 Key값에 Switch의 true 상태가 저장되어 있다면 재부팅했을 때 Switch가 true 상태로 유지되잖아요? 그런데 true 상태 일 때 나타내야하는 TextView 라거나 하는 것들은 전혀 동작이 없습니다.

이걸 이 이상 어찌 설명해야하는지를 모르겠네요 ㅠㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • "true 안에서 실행되는 TextView의 수정이라던가 SeekBar의 표현이라던가를 같이 불러오는 방법은 없나요?" 질문이 정확히 이해가 되지 않아서 좀더 자세한 설명을 부탁 드립니다. 알 수 없는 사용자 2018.6.26 11:25
  • 본문에 내용을 조금 추가했습니다. 근데 진짜 이 이상 어떻게 설명을 해야할지..ㅠ 알 수 없는 사용자 2018.6.26 11:46
  • 조금 있다가 제가 지금 코드 구글 드라이브 올려서 링크 걸어놓을테니 한번만 봐주실 수 있나요? 이 코드를 왠지 최대한 줄일 수 있는 방법이 있을 거 같은데.. 알 수 없는 사용자 2018.6.26 11:58
  • true 일때 _Gain_SeekBar.Progress = _Saved_Data.GetInt("_Test_Pro", 0); 는 동작하는데 _Gain_SeekBar_Text.Text = "" + _Saved_Data.GetInt("_Test_Pro", 0); 는 동작하지 않는다는 말씀이신가요? 알 수 없는 사용자 2018.6.26 12:00
  • 네 올려주세요 알 수 없는 사용자 2018.6.26 12:09
  • https://drive.google.com/open?id=1Dx0GN7t7ecJGMmPHF2b22_wMSx4jgZeB 이거인데요, 현재 이 상태에서 코드를 줄일 수 있는 방법이 없을까요? 하고 싶은것도 같이 올려 놨습니다. 알 수 없는 사용자 2018.6.26 14:01

1 답변

  • Seekbar 를 disable 시켰을떄 안보이는것 같은 현상은 앱 테마마다 컨셉이 다르긴 하지만 아마도 옅은 회색으로 비활성화 되서 안보이는 것처럼 보이시는것 같습니다. 저도 테스트해보면 progress 0 인 상태에선 티가 잘 안나더라구요. 코드를 간략화 하는건 도움을 구하시는것 보다는 계속 해보는것 밖에는 답이 없다고 생각해요. 사람마다 코딩스타일이 다르고 뭐가 정답이다 단정짓기 애매한 부분도 있구요..

    일단 자바로 짜봤는데 흐름만 참고하시길 바랍니다.

    public class TestLayoutActivity extends AppCompatActivity {
        private final static String KEY_SEEKBAR_VALUE = "seekbar_value";
        private final static String KEY_SWITCH_VALUE = "switch_value";
    
        private SeekBar mSeekBar;
        private Switch mSwitch;
        private TextView mTextView;
    
        @Override
        protected void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.test_layout);
    
            mSeekBar = findViewById(R.id.seekBar);
            mSwitch = findViewById(R.id.testSwitch);
            mTextView = findViewById(R.id.textView);
    
            final boolean checkedVlaue = getSwitchValue();
            mSwitch.setChecked(checkedVlaue);
            updateVisibleState(checkedVlaue);
    
            final int progressValue = getSeekbarValue();
            mSeekBar.setProgress(progressValue);
            mTextView.setText(String.valueOf(progressValue));
    
    
            mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    updateVisibleState(isChecked);
                }
            });
    
            mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    mTextView.setText(String.valueOf(progress));
                }
    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
    
                }
    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
    
                }
            });
        }
    
        private void updateVisibleState(boolean isChecked) {
            mSeekBar.setEnabled(isChecked);
            mTextView.setVisibility(isChecked ? View.VISIBLE : View.GONE);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            saveSeekbarValue(mSeekBar.getProgress());
            saveSwitchValue(mSwitch.isChecked());
        }
    
        private void saveSeekbarValue(int value) {
            final SharedPreferences.Editor prefs = PreferenceManager.getDefaultSharedPreferences(this).edit();
            prefs.putInt(KEY_SEEKBAR_VALUE, value);
            prefs.apply();
        }
    
        private int getSeekbarValue() {
            return PreferenceManager.getDefaultSharedPreferences(this).getInt(KEY_SEEKBAR_VALUE, 0);
        }
    
        private void saveSwitchValue(boolean value) {
            final SharedPreferences.Editor prefs = PreferenceManager.getDefaultSharedPreferences(this).edit();
            prefs.putBoolean(KEY_SWITCH_VALUE, value);
            prefs.apply();
        }
    
        private boolean getSwitchValue() {
            return PreferenceManager.getDefaultSharedPreferences(this).getBoolean(KEY_SWITCH_VALUE, false);
        }
    }
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 감사합니다 ㅎ 역시 줄이는 것에 대해서는 제가 좀 더 고민해보도록 하겠습니다! 매번 감사합니다 ㅎ 알 수 없는 사용자 2018.6.26 16:45

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)