У меня проблема с использованием кнопки «Вверх» в моем приложении. Я уже прочитал много сообщений, посвященных аналогичным проблемам, но ни одно из них не посвящено той же проблеме, которую я хочу решить.
У меня есть два вида деятельности - A
и B
.
A отображает список задач для выбранной категории из базы данных SQLite. Каждая задача принадлежит к категории, поэтому A имеет частную переменную topicId
, переданную из намерения (она действует как фильтр). Когда я нажимаю на задачу, открывается действие B, которое позволяет редактировать его. На B есть кнопка «Вверх», которая возвращает вас к A (списку задач).
Поскольку A получает topicId из намерения, когда я нажимаю кнопку «Вверх» в B, в A нет намерения, а topicId по умолчанию равен -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");
}
Однако значение savedInstanceState, передаваемое в onCreate (), всегда является null
.
Я ввел методы жизненного цикла журнала A, чтобы посмотреть, что произойдет.
onCreate()
запускается, а связка нулеваяonSaveInstanceState()
запускается и сохраняет мой идентификаторonDestroy()
A, затем onCreate()
A, а комплект - null
!Может кто-нибудь сказать мне, почему Bundle в onCreate()
в этом случае нулевой? Я установил родительскую активность 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 лет ...
Я отправлю код, если он вам понадобится. Я не хочу быть слишком подавляющим вначале.
Редактировать
После еще нескольких поисков я нашел это решение: ссылка на сайт
Сказано:
When you press back, the Activity is destroyed and the data it had is lost. After this you will always get null in the bundle as a new, fresh instance is being created when you reopen the app.
The Bundle savedInstanceState is used when the activity is being recreated due to some changes (like rotation), or because it was paused in the background for a long time.
If you want to persist some data, consider SharedPreferences for small stuff, or maybe a database (SQLite, Realm) or files for large stuff.
Насколько я понимаю, Bundle используется Android только в некоторых конкретных случаях, например, когда вы выключаете / включаете экран, нажимаете кнопку «Домой» или меняете ориентацию экрана. В таких случаях, как мой, вы должны полагаться на некоторые другие функции, такие как класс SharedPreferences
. Я приветствую людей с более продвинутыми знаниями, чем я, чтобы они пролили немного света на этот вопрос.
В действии A у меня есть фрагмент с RecyclerView и внутри него несколько CardView для задач. Я прикрепил onClickListener к задачам, и при щелчке по нему следующий код обрабатывает его: @Override
public void onItemClick(int id) {
Intent intent = new Intent(getActivity(), CreateTaskActivity.class);
intent.putExtra(CreateTaskActivity.EXTRA_TASK_ID, id);
startActivity(intent);
}
что такое android: launchMode of activity b?
Он не указан, поэтому это должно быть значение по умолчанию standard
.
кнопка "Назад" уничтожает действие, лучший способ - использовать для этого SharedPreferences.
Как вы начали занятие Б? SavedInstanceState - это то, что Android делает, когда ему нужна память и убивает действия, чтобы освободить память /