Каков наилучший способ открыть последний отображаемый фрагмент при повторном открытии приложения?

#android #android-lifecycle

#Android #android-жизненный цикл

Вопрос:

Я использую drawerlayout, чтобы позволить пользователю открывать разные анкеты. Вопросы в анкете представляют собой разные фрагменты. Проблема в том, что когда запускается анкета и, скажем, использование переходит к вопросу № 5 и выходит из приложения, тогда ей или ему придется начинать с домашней страницы, то есть с первого фрагмента в макете ящика. Как мне сохранить последний показанный фрагмент, т.Е. Вопрос, чтобы я мог снова показать его при повторном открытии приложения?

Ниже приведен код в одном из фрагментов, которые не открываются, если пользователь нажимает кнопку «Домой».

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) { \ handle view related code and triggering other functions }

@Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        cardContext = context;
        if (context instanceof OnShoppingDoneListener) {
            onShoppingDoneListener = (OnShoppingDoneListener) context;
        } else {
            throw new RuntimeException(context.toString()
                      " must implement OnFragmentInteractionListener");
        }
    }


    @Override
    public void onResume() {
        super.onResume();
        bundle = getArguments();
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    @Override
    public void onDetach() {
        super.onDetach();
        onShoppingDoneListener = null;
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putSerializable("cartContent", selectionItemArrayList);
    }
 

И вот соответствующее основное действие code, в котором я открываю этот конкретный фрагмент:

 public class MainActivity extends AppCompatActivity implements
        OnRestaurantSelect {

    public void onRestaurantSelect(Bundle bundle){

        boolean direction = bundle.getBoolean("direction");
        if (direction) {
            MenuCardFragment fragment = new MenuCardFragment();
            openFragment(bundle, fragment, true);
        } else {
            AddressFragment fragment = new AddressFragment();
            openFragment(bundle, fragment, false);
        }
    }

    private void openFragment(Bundle bundle, Fragment fragment, Boolean direction) {
        // Passing the pickup or delivery option   address   schedule   restaurant   order details   payment
        fragment.setArguments(bundle);

        //Starting fragment with animation
        if (direction) {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_right).replace(R.id.frame_container, fragment, null);
            fragmentTransaction.commit();
        } else {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_left).replace(R.id.frame_container, fragment, null);
            fragmentTransaction.commit();
        }
    }
 

Комментарии:

1. Как вы теперь понимаете, что для конкретного вопроса он принадлежит определенному фрагменту>> например, Q.3 относится к фрагменту-B откуда вы знаете, что это для фрагмента-B, а не C?

2. Это потому, что он кодируется на основе определенных параметров, например, какой поток вопросов выбирает пользователь. Если вы посмотрите на функцию onRestaurantSelect, вы заметите, что я открываю пакет и вижу, хочет ли пользователь перейти к следующему вопросу или к предыдущему. У меня есть аналогичные функции, определяемые интерфейсом, которые определяют следующий или предыдущий вопрос.

3. Итак, я имею в виду, что если в вашей базе данных вопросов есть поле, указывающее, через какой фрагмент следует обрабатывать каждый из них; тогда вы можете просто сохранить идентификатор последнего вопроса; и на основе этого идентификатора; перейдите к соответствующему фрагменту при повторном запуске приложения

4. Понял. Да, я могу сохранить это в пакете, но тогда как мне справиться с этим onResume? Это было бы в основном действии, я прав? Я не уверен, как это реализовать.

Ответ №1:

Создайте ключ для каждого фрагмента, при выходе из приложения сохраните этот ключ в SharedPreference, а затем при перезапуске приложения получите этот SharedP и откройте этот фрагмент