#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 и откройте этот фрагмент