Вы уже сохраняете идентификатор отмеченных RadioButton
s следующим образом:
@Override
protected void onSaveInstanceState(Bundle outState) {
//
// saving other values...
//
outState.putInt("radGroup1", resultGroup.getCheckedRadioButtonId());
outState.putInt("radGroup2", valueGroup.getCheckedRadioButtonId());
Log.d(TAG, "onSaveInstanceState: result id " + resultGroup.getCheckedRadioButtonId() + ", value id = " + valueGroup.getCheckedRadioButtonId());
super.onSaveInstanceState(outState);
}
Таким образом, вы можете получить сохраненные значения либо в onCreate()
(примечание: только if(savedInstanceState != null)
), либо в onRestoreInstanceState()
.Второй метод будет вызываться только в том случае, если saveInstanceState не null
.
private int checkedResultButtonsId;
private int checkedValueButtonsId;
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
checkedResultButtonsId = savedInstanceState.getInt("radGroup1");
checkedValueButtonsId = savedInstanceState.getInt("radGroup2");
Log.d(TAG, "onRestoreInstanceState: result id " + checkedResultButtonsId + ", value id = " + checkedValueButtonsId);
}
Обычно вам не нужно устанавливать проверенное состояние RadioButton
вручную после изменения конфигурации,Мой пример приложения (просто обычный Android, без привязки данных) автоматически сохраняет состояние RadioButton
s, поэтому я не уверен, почему вам нужно сохранять идентификаторы, как вы.Ваш вопрос звучит так, как RadioGroup
теряет свое состояние при вращении.
(Может быть, вы просто не звоните super.onRestoreInstanceState()
? По крайней мере, он отсутствует в вашем фрагменте кода MainActivity)
Так что япопытался смоделировать этот эффект путем сброса всех RadioButton
с без проверки после вызова на super.onRestoreInstanceState()
и восстановил состояние, используя сохраненные значения:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
resetRadioButtons(resultGroup);
resetRadioButtons(valueGroup);
checkedResultButtonsId = savedInstanceState.getInt("radGroup1");
checkedValueButtonsId = savedInstanceState.getInt("radGroup2");
// if saved values are > 0: set checked state to 'true'
if(checkedResultButtonsId > 0){
((RadioButton)resultGroup.findViewById(checkedResultButtonsId)).setChecked(true);
}
if(checkedResultButtonsId > 0){
((RadioButton)valueGroup.findViewById(checkedValueButtonsId)).setChecked(true);
}
}
Результат был немного странным: восстановленные RadioButton
, похоже, застряли в непроверенном состоянии и восстановились только после проверки их брата RadioButton
.
Я думаю, мой фрагмент кода каким-то образом помешал работе.super.onRestoreInstanceState()
.Поэтому я переместил проблемные детали в onStart()
:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
checkedResultButtonsId = savedInstanceState.getInt("radGroup1");
checkedValueButtonsId = savedInstanceState.getInt("radGroup2");
}
Примечание: resetRadioButtons()
- это мой единственный способ убедиться, что есть что восстанавливать: снимите флажок с каждого RadioButton
в RadioGroup
.
@Override
protected void onStart() {
super.onStart();
resetRadioButtons(resultGroup);
resetRadioButtons(valueGroup);
if(checkedResultButtonsId > 0){
((RadioButton)resultGroup.findViewById(checkedResultButtonsId)).setChecked(true);
}
if(checkedResultButtonsId > 0){
((RadioButton)valueGroup.findViewById(checkedValueButtonsId)).setChecked(true);
}
}
Это хорошо сработало, поэтому я надеюсь, что это поможет и вам.