сохранить радиогруппу onSavedInstance

у меня проблема с сохранением статуса радиогруппы при повороте экрана.
У меня есть две независимые радиогруппы с двумя радиокнопками для каждой радиогруппы. Я пытаюсь использовать get, getCheckedRadioButtonId, но это вообще не работает.

Что я делаю неправильно и как правильно сохранить радиокнопку с проверенной радиогруппой? Заранее спасибо!

РЕДАКТИРОВАТЬ:

XML:

     <RadioGroup
            android:id="@+id/radio_result_group"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintBottom_toBottomOf="@+id/textView"
            app:layout_constraintEnd_toEndOf="@+id/convert_to3"
            app:layout_constraintTop_toTopOf="@+id/textView">

            <RadioButton
                android:id="@+id/metric_sys_result"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:padding="4dp"
                android:text="@string/metric_sys"
                android:textSize="14sp" />

            <RadioButton
                android:id="@+id/imperial_sys_result"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="4dp"

                android:layout_weight="1"
                android:padding="4dp"
                android:text="@string/imperial_sys"
                android:textColorLink="@color/colorAccent"
                android:textSize="14sp"
                app:layout_constraintBottom_toBottomOf="@+id/measurementView" />
        </RadioGroup>
<RadioGroup
        android:id="@+id/radio_value_gropu"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="@+id/measurementView"
        app:layout_constraintEnd_toEndOf="@+id/convert_from5"
        app:layout_constraintTop_toTopOf="@+id/measurementView">

        <RadioButton
            android:id="@+id/metric_sys_value"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="4dp"
            android:text="@string/metric_sys"
            android:textSize="14sp" />

        <RadioButton
            android:id="@+id/imperial_sys_value"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="4dp"

            android:layout_weight="1"
            android:padding="4dp"
            android:text="@string/imperial_sys"
            android:textColorLink="@color/colorAccent"
            android:textSize="14sp"
            app:layout_constraintBottom_toBottomOf="@+id/measurementView" />
    </RadioGroup>

//java-код

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.RadioGroup;
    import android.widget.Spinner;
    import android.widget.SpinnerAdapter;
    import android.widget.TextView;
    import android.widget.Toast;

    import butterknife.BindView;
    import butterknife.ButterKnife;
    import butterknife.OnClick;


    public class MainActivity extends AppCompatActivity  {
        protected double getEnteredValue;
        protected SpinnerAdapter checkAdapter;
        protected int pos;
   protected ArrayAdapter<String> adapter 1, adapter2, adapter3,
                adapter4;


        @BindView(R.id.unit_From_spinner)Spinner spinnerFrom;
        @BindView(R.id.unit_To_spinner)Spinner spinnertTo;
         @BindView(R.id.radio_result_group) RadioGroup resultGroup;
        @BindView(R.id.radio_value_gropu) RadioGroup valueGroup;
       @BindView(R.id.valueEditTextView) EditText valueEdit;
      @BindView(R.id.resultView) TextView resultView;
        @BindView(R.id.conver_button) Button  convertButton;

        @Override
        public void onSaveInstanceState(Bundle savedInstanceState) {
            savedInstanceState.putString("result",resultView.getText().toString());
            savedInstanceState.putString("value",valueEdit.getText().toString());
            savedInstanceState.putInt("from",spinnerFrom.getSelectedItemPosition()); // get selected item from spinner 1
            savedInstanceState.putInt("to",spinnertTo.getSelectedItemPosition());
            savedInstanceState.putInt("radGroup1", resultGroup.getCheckedRadioButtonId());
            savedInstanceState.putInt("radGroup2", valueGroup.getCheckedRadioButtonId());
            super.onSaveInstanceState(savedInstanceState);
        }


            @Override
        protected void onCreate(Bundle savedInstanceState)  {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.unifiedlayout);
            ButterKnife.bind(this);
            convertButton.setEnabled(false);
        adapter1 = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_item,getResources().getStringArray( R.array.adapter_1) );
    adapter2 = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_item,getResources().getStringArray(R.array. adapter_2));
    adapter3 = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_item,getResources().getStringArray( R.array. adapter_3) );
    adapter4 = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_item,getResources().getStringArray(R.array. adapter_4));


        }

        @Override
        public void onRestoreInstanceState(Bundle savedInstanceState) {
            resultView.setText(savedInstanceState.getString("result"));
            valueEdit.setText(savedInstanceState.getString("value"));
            spinnerFrom.setSelection(savedInstanceState.getInt("from"));
            spinnertTo.setSelection(savedInstanceState.getInt("to"));

    //?
            super.onSaveInstanceState(savedInstanceState);
        }

    @OnClick({R.id.button1, R.id.button2,R.id.button3,R.id.button4
           } )
    public void setViewOnClickEvent(View view){
        switch(view.getId()){
            case R.id.mass_button:
                            fillSpinner(adapter1, adapter2); // fill spinner with values
                break;
            case R.id.speed_button:
                fillSpinner(adapter3,
                        adapter4);
                break;
       }
    }

protected void fillSpinner (final ArrayAdapter<String> spinnerToAdapter,
                                final ArrayAdapter<String> spinnerFromAdapter){

        valueGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup valueGroup, int checkedId) {
                pos = valueGroup.indexOfChild(findViewById(checkedId));
                switch (pos) {
                    case 0:
                        spinnerFrom.setAdapter(spinnerToAdapter);
                        break;
                    case 1:
                        spinnerFrom.setAdapter(spinnerFromAdapter);
                        break;
                }
            }
        });
        resultGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup resultGroup, int checkedId) {
                pos = resultGroup.indexOfChild(findViewById(checkedId));
                switch (pos) {
                    case 0:
                        spinnertTo.setAdapter(spinnerToAdapter);
                        break;
                    case 1:
                        spinnertTo.setAdapter(spinnerFromAdapter);
                        break;
                }
            }
        });
    }

person GremlinShX    schedule 04.02.2019    source источник


Ответы (1)


Вы уже сохранили идентификатор проверенных RadioButton следующим образом:

@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(). Второй метод будет вызываться только в том случае, если savedInstanceState не равно 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, поэтому я не уверен, почему вам нужно сохранять идентификаторы, как вы. Ваш вопрос звучит так, будто RadioGroup теряет свое состояние при вращении.

(Может быть, вы просто не вызываете super.onRestoreInstanceState()? По крайней мере, он отсутствует в вашем фрагменте кода MainActivity)

Поэтому я попытался сымитировать этот эффект, сбросив все RadioButton в unchecked после вызова 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);
    }
}

Это сработало хорошо, поэтому я надеюсь, что это будет полезно и для вас.

person Bö macht Blau    schedule 05.02.2019
comment
Да, журналы выглядят хорошо. Но только сейчас я замечаю, что мой AndroidSpinner не сохраняет свой адаптер в onSaveInstanceState r, и когда приложение уничтожается и воссоздается в onRestoreInstanceState, оно просто пустое. Спасибо за помощь! - person GremlinShX; 06.02.2019