Как сохранить SpinnerAdapter при повороте экрана?

162
02 октября 2019, 19:50

Я новичок в Андроиде , и во время разработки у меня возникла проблема с сохранением AndroidSpinner при повороте єкрана

В моем приложениие есть 2 SpinnerAdapter которые заполняю тся парами из ArrayAdapter<String>.

В методе onCreate создается 4 (в будущем их будет немного больше) адаптера для них. Дальше когда пользователь нажимает button1 или button2 то spinnerFrom и spinnerTo заполняются adapter1 and adapter2, дальше используя Radiogroup пользователь выбирает какой из двух адаптеров он хочет видеть в AndroidSpinner.

Для сохранения статуса UI при повороте я в методе onSavedInstance написал след. код

savedInstanceState.putInt("from",spinnerFrom.getSelectedItemPosition);
savedInstanceState.putInt("to",spinnertTo.getSelectedItemPosition());

а в методе OnRestoreIstanceState я передаю значения из onSavedInstance для его востановления

spinnerFrom.setSelection(savedInstanceState.getInt("from"));
spinnertTo.setSelection(savedInstanceState.getInt("to"));

Но вот в чем проблема : когда приложение восстанавливается, адаптеры принимают значение null, так как метод setAdapter вызывается после нажатия на кнопку и соответственно в методе onCreate они попросту null Для провери этого была создана техническая кнопка и метод под нее :

 protected void checkAdapter () {
       //get Adapter from spinners
        SpinnerAdapter valueAdapter = spinnerFrom.getAdapter();
        SpinnerAdapter resultAdapter = spinnertTo.getAdapter();
    if (valueAdapter == null | resultAdapter== null) {
                Toast.makeText(this, “adapter null” , Toast.LENGTH_SHORT).show();
    }
    else{
    Toast.makeText(this, “adapters not null” , Toast.LENGTH_SHORT).show();
    }
    }

Вопрос : Как правильно сохранить AdroidSpinner и его адаптер используя OnSavedInstance а затем востановить его в onRestoreInstance когда спиннеры заполняются не в onCreate, а динамически ?
Спасибо зарание !

Java code:

    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;
//butterknife bindings
@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);
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);
//adapters for spinners 
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
@OnClick({R.id.button1, R.id.button2,R.id.button3,R.id.button4} )
public void setViewOnClickEvent(View view){
    switch(view.getId()){
        case R.id. button1:
        fillSpinner(adapter1, adapter2); // fill spinner with values
                break;
            case R.id. button2:
                fillSpinner(adapter3,
                        adapter4);
                break;
        //button for check if any adapter active
         case R.id.buttonAdapter:
        checkAdapter () ;   
               break;   
       }
    }
//fill spinners when user checks radiobutton in radiogroups
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;
                }
            }
        });
    }
//simple method for check if both spinners has null value
protected void checkAdapter () {
   //get Adapter from spinners
    SpinnerAdapter valueAdapter = spinnerFrom.getAdapter();
    SpinnerAdapter resultAdapter = spinnertTo.getAdapter();
if (valueAdapter == null | resultAdapter== null) {
            Toast.makeText(this, “adapter null” , Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(this, “adapters not null” , Toast.LENGTH_SHORT).show();
}
}
READ ALSO
Как считать значение Spinner за пределами onItemSelected?

Как считать значение Spinner за пределами onItemSelected?

Всем привет, я новичок в AndroidУ меня есть два Spinner и в зависимости от выбора переходим к действию

108
Как отнести RGB значение к 7 основным цветам?

Как отнести RGB значение к 7 основным цветам?

Мне нужно полученное RGB значение пикселя отнести к 7 основным цветам, каким образом это сделать на Java?

173
Проблема с JAVA_HOME

Проблема с JAVA_HOME

В проекте нажал Invalidate and restart студия закрылась и вдруг выскочило окно

147
Не находит путь до css файлов

Не находит путь до css файлов

Делаю сайт на SpringЕсть страница html,при запуске не отображается графическая часть,а только формы ввода,полагаю дело в том,что java не находит...

129