Фрагмент сохраняет предыдущее состояние, но не восстанавливает правильно - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть actviity, который загружает фрагмент в onCreate следующим образом:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    loadFragment(new FragmentName());
}

private void loadFragment(Fragment fragment) {
    FragmentManager fm = getFragmentManager();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    // replace the FrameLayout with new Fragment
    fragmentTransaction.replace(R.id.frag_lay, fragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

И я пытаюсь сохранить и восстановить состояние загруженного фрагмента следующим образом:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if (savedInstanceState != null) {
        spinner.setSelection(savedInstanceState.getInt("spinner"));
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putInt("spinner", spinner.getSelectedItemPosition());
}

Что происходит, так это то, что я правильно сохраняю положение моего счетчика, но в любом случае счетчик воссоздается, и его положение является значением по умолчанию, хотя я выбираю сохраненный.Я не совсем уверен, почему это происходит, кто-нибудь может помочь?

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

Я настраиваю счетчик здесь:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.fragment_campus, container, false);

    ...
    setupSpinner();
    return view;
}

private void setupSpinner() {
    ArrayAdapter<CharSequence> adapter = 
              ArrayAdapter.createFromResource(this.getActivity(),
                        R.array.array_spinner, 
                            android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter)
}

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

Я сделал еще несколько попыток.Я поставил несколько тостов, чтобы отобразить, что происходило так:

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if (savedInstanceState != null) {
        Toast toast = Toast.makeText(getActivity(), "saved !=", Toast.LENGTH_SHORT);
        toast.show();
    }else{
        Toast toast = Toast.makeText(getActivity(), "saved ==", Toast.LENGTH_SHORT);
        toast.show();
    }
}

Когда я пытался запустить этот код на эмуляторе, это происходит: когда я впервые запускаю приложение, оно идет в операторе else (который должен бытьправо).Когда я меняю ориентацию, отображаются оба тоста (очевидно, я сначала что-то сохранил в onSaveInstanceState), и это неправильно.Почему это происходит?

1 Ответ

0 голосов
/ 02 декабря 2018

Измените эту строку в своей активности:

loadFragment(new FragmentName());

на эту:

if (savedInstanceState == null) {
    loadFragment(new FragmentName());
}

FragmentManager автоматически сохранит и восстановит фрагменты в вашей активности для васкак часть того же процесса, который сохраняет и восстанавливает состояние этих фрагментов.Однако сейчас, каждый раз, когда ваша деятельность воссоздается, вы выбрасываете старый фрагмент и заменяете его новым.

...