У меня есть 2 действия (A и B) в моем приложении для Android, и я использую намерение перейти от действия A к действию B. Использование parent_activity включено:
<activity
android:name=".B"
android:label="B" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app_name.A" />
</activity>
Я также использую тему, которая обеспечивает кнопку UP.
Поэтому после того, как я вызвал операцию BI, можно использовать кнопку UP, чтобы вернуться к операции A. Проблема заключается в том, что приложение, похоже, снова вызывает функцию onCreate () операции A, и это не то поведение, которое мне нужно. Мне нужно, чтобы упражнение A выглядело так же, как оно выглядело до того, как я назвал упражнение B.
Есть ли способ добиться этого?
заранее спасибо
РЕДАКТИРОВАТЬ:
Я не написал никакого кода, чтобы начать действие B с действия A. Я думаю, что оно автоматически генерируется Eclipse.
Класс B выглядит так:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_b, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Ответы:
Вы объявили активность A со стандартом
launchMode
в манифесте Android. Согласно документации это означает следующее:Следовательно, система вынуждена воссоздавать действие A (т.е. вызывать
onCreate
), даже если стек задач обрабатывается правильно.Чтобы решить эту проблему, вам нужно изменить манифест, добавив следующий атрибут в объявление действия A:
Примечание. Вызов
finish()
(как предлагалось ранее в качестве решения) работает только в том случае, если вы полностью уверены, что экземпляр действия B, который вы прерываете, живет поверх экземпляра действия A. В более сложных рабочих процессах (например, запуск действия B из уведомления) это может быть не так, и вы должны правильно запустить действие A из B.источник
navigateUpFromSameTask(...)
должно быть добавлениеFLAG_ACTIVITY_CLEAR_TOP
кupIntent
(черезnavigateUpTo(...)
которое должно происходить то же поведение (согласно этому руководству ), но флаг никогда не устанавливается - и, следовательно, этот ответ имеет смыслОбновленный ответ: Навигация вверх
Вы должны указать, какое действие является подходящим родителем для каждого действия. Это позволяет системе упростить навигационные шаблоны, такие как Up, поскольку система может определить логическое родительское действие из файла манифеста.
Поэтому для этого вы должны объявить родительскую активность в теге Activity с атрибутом
android:parentActivityName
Подобно,
С родительским действием, объявленным таким образом, вы можете перейти к соответствующему родителю, как показано ниже,
Поэтому, когда вы вызываете
NavUtils.navigateUpFromSameTask(this);
этот метод, он завершает текущее действие и запускает (или возобновляет) соответствующее родительское действие. Если целевое родительское действие находится в заднем стеке задачи, оно переносится, как определеноFLAG_ACTIVITY_CLEAR_TOP
.И чтобы отобразить кнопку вверх, вы должны объявить
setDisplayHomeAsUpEnabled():
Старый ответ: (без навигации вверх, по умолчанию навигация назад)
Это происходит только в том случае, если вы снова запускаете Занятие A из Занятия B.
Использование
startActivity()
.Вместо этого из Действия A запустите Activity B, используя
startActivityForResult()
переопределениеonActivtyResult()
в Activity A.Теперь в Деятельности B просто
finish()
нажмите на кнопку Up. Итак, теперь вы обратились к Деятельности АonActivityResult()
без повторного создания Деятельности А.источник
NavUtils.navigateUpFromSameTask(this);
пишитеfinish()
.finish()
илиstartActivityForResult()
в своей документации по навигации ( developer.android.com/design/patterns/navigation.html )?У меня была почти такая же настройка, которая привела к тому же нежелательному поведению. Для меня это сработало: добавив следующий атрибут к активности A в
Manifest.xml
моем приложении:Смотрите эту статью для более подробного объяснения.
источник
Хотя старый вопрос, вот еще (имхо самое чистое и лучшее) решение , как и все предыдущие ответившие не работало для меня , так как я deeplinked активности B от Widget .
[ https://stackoverflow.com/a/31350642/570168 ]
Но также смотрите: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android
источник
Лучший способ добиться этого - использовать две вещи: call:
Теперь, чтобы это работало, вам нужно, чтобы в файле манифеста было указано, что у действия A есть родительское действие B. Для родительского действия ничего не нужно. В версии 4 и выше вы получите красивую стрелку назад без дополнительных усилий (это можно сделать и в более низких версиях, с небольшим кодом, я опишу это ниже). Вы можете установить эти данные на вкладке manifest-> application в графическом интерфейсе (прокрутите вниз до имени родительского действия и введите его вручную)
Узел поддержки:
если вы хотите поддерживать версию ниже версии 4, вам также необходимо включить метаданные. щелкните правой кнопкой мыши на активности, добавьте-> метаданные, name = android.support.PARENT_ACTIVITY и value = your.full.activity.name
чтобы получить красивую стрелку в более низких версиях:
обратите внимание, вам понадобится поддержка библиотеки версии 7, чтобы все это заработало, но оно того стоит!
источник
То, что работало для меня, добавляло:
чтобы
TheRelevantActivity.java
и сейчас он работает как положенои да, не забудьте добавить:
getSupportActionbar.setDisplayHomeAsUpEnabled(true);
вonCreate()
методеисточник
Я пытался
android:launchMode="singleTask"
, но это не помогло. Работал для меня, используяandroid:launchMode="singleInstance"
источник
Добавление к ответу @ LorenCK, изменение
к приведенному ниже коду, если ваша деятельность может быть инициирована из другой деятельности, и это может стать частью задачи, запущенной другим приложением
Это запустит новую задачу и запустит родительскую активность вашей деятельности, которую вы можете определить в манифесте, как показано ниже в версии Min SDK <= 15
Или,
parentActivityName
если его> 15источник
parentActivityName
для SDK> 15, иначе это даст вам случайные сбоиУ меня была похожая проблема с использованием Android 5.0 с плохим именем родительского действия
Я удалил com.example.myfirstapp из имени родительского действия, и он работал правильно
источник
Добавьте к своей деятельности информацию манифеста с атрибутом
работает хорошо для меня
источник
В классе Java: -
В Манифесте: -
Это поможет тебе
источник
как бэк пресс
источник
попробуй это:
источник
Вход в мой манифест и добавление
android:launchMode="singleTop"
к действию помог мне.Это определенно решило мою проблему, потому что я не хотел, чтобы Android создавал новый экземпляр предыдущего действия после нажатия
Up
кнопки на панели инструментов - вместо этого я хотел использовать существующий экземпляр предыдущего действия при переходе вверх по иерархии навигации.Ссылка: android: launchMode
источник
Попробуйте это решение использовать NavUtils.navigateUpFromSameTask (это); в детской деятельности: https://stackoverflow.com/a/49980835/7308789
источник