У меня проблема с использованием кнопки «Вверх» в моем приложении. Я уже прочитал много сообщений о подобных проблемах, но ни один из них не касается той же проблемы, которую я хочу решить.
У меня есть два занятия - A
и B
. Отображает список задач для выбранной категории из базы данных SQLite. Каждая задача относится к категории, поэтому A имеет приватную переменную topicId
, переданную из Intent (она действует как фильтр). Когда я нажимаю на задачу, открывается действие B, которое позволяет вам редактировать его. B имеет кнопку «Вверх», которая возвращает вас к A (списку задач).
Поскольку A получает идентификатор темы из намерения, когда я нажимаю кнопку «Вверх» в B, в A нет намерения, а значение темы Id по умолчанию равно -1. Я думал, что сохранить идентификатор легко - просто сохраните его так:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("topicId", this.TOPIC_ID);
}
В методе onCreate() я использовал:
if(savedInstanceState != null) {
this.TOPIC_ID = savedInstanceState.getInt("topicId");
}
Тем не менее, saveInstanceState, который передается в onCreate(), всегда равен null
. Я поместил Log в методы жизненного цикла A, чтобы посмотреть, что произойдет.
- Я в A -
onCreate()
работает, а пакет нулевой - Я нажимаю на задачу в списке (фрагмент, загруженный в ViewPager)
onSaveInstanceState()
запускается и сохраняет мой идентификатор- Теперь я в B и нажимаю кнопку «Вверх» (не клавишу «Назад» на телефоне).
- Он запускает A's
onDestroy()
, затем A'sonCreate()
и пакетnull
!
Может ли кто-нибудь сказать мне, почему Bundle в onCreate()
в этом случае имеет значение null? Я установил родительскую активность B как A в manifest.xml. Я также прочитал решение, которое предполагает, что вы добавили android:launchMode="singleTop"
в манифест для A.
Это, однако, не то, что я хочу - если для него установлено значение singleTop, родительская активность НЕ уничтожается, когда вы нажимаете кнопку «Вверх». Я хочу, чтобы он был уничтожен и воссоздан, потому что в B я вношу изменения в задачу, которую я хочу немедленно перезагрузить из БД в A, когда я нажимаю «Вверх».
Буду признателен, если кто-нибудь скажет мне, почему Android передает пакет null
onCreate()
. Я уже пытался добавить этот код в B, и это не сработало:
Intent intent = NavUtils.getParentActivityIntent(this);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpFromSameTask(this);
Я думаю, что этот пост посвящен той же проблеме, но это не было ответил 4 года...
Я отправлю код, если вам это нужно. Я не хочу быть слишком подавляющим в начале.
Изменить
После еще нескольких поисков я нашел это решение: ссылка
Сказано:
Когда вы нажимаете назад, действие уничтожается, а данные, которые у него были, теряются. После этого вы всегда будете получать нуль в пакете, поскольку при повторном открытии приложения создается новый свежий экземпляр.
Bundle saveInstanceState используется, когда действие воссоздается из-за некоторых изменений (например, поворота) или из-за того, что оно было приостановлено в фоновом режиме в течение длительного времени.
Если вы хотите сохранить некоторые данные, рассмотрите SharedPreferences для небольших вещей или, возможно, базу данных (SQLite, Realm) или файлы для больших вещей.
Насколько я понимаю, Bundle используется Android только в некоторых специфических случаях, например, когда вы включаете/выключаете экран, нажимаете кнопку «Домой» или меняете ориентацию экрана. В таких случаях, как мой, вы должны полагаться на некоторые другие функции, такие как класс SharedPreferences
. Я приветствую людей с более продвинутыми знаниями, чем я, чтобы пролить больше света на этот вопрос.
@Override
public void onItemClick(int id) {
Intent intent = new Intent(getActivity(), CreateTaskActivity.class);
intent.putExtra(CreateTaskActivity.EXTRA_TASK_ID, id);
startActivity(intent);
}
- person castafiore   schedule 03.05.2018standard
. - person castafiore   schedule 04.05.2018