Как я могу вернуться к родительской активности правильно?

У меня есть 2 действия (A и B) в приложении для Android и я использую намерение перейти от действия A к активности B. Использование parent_activity включено:

   

Я также использую тему, которая предоставляет кнопку UP.

Поэтому после того, как я вызвал активность, BI может использовать кнопку UP, чтобы вернуться к активности A. Проблема в том, что приложение, похоже, снова вызывает функцию onCreate () активности A, и это не то поведение, в котором я нуждаюсь. Мне нужно, чтобы активность А выглядела так же, как и раньше, когда я называл активность Б.

Есть ли способ достичь этого?

заранее спасибо

РЕДАКТИРОВАТЬ:

Я не писал код для запуска активности 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:

 android:launchMode="singleTop" 

Примечание: call finish() (как предлагается раньше), работает только тогда, когда вы полностью уверены, что экземпляр операции B завершает жизнь поверх экземпляра активности A. В более сложных рабочих процессах (например, запуск активности B из уведомление), это может быть не так, и вы должны правильно запустить активность A из B.

Обновленный ответ: Up Navigation Design

Вы должны объявить, какая деятельность является соответствующим родителем для каждого вида деятельности. Это позволяет системе упростить навигационные шаблоны, такие как Up, потому что система может определять логическую родительскую активность из файла манифеста.

Поэтому для этого вам нужно объявить родительскую активность в теге Activity с атрибутом

android:parentActivityName

Подобно,

   ...       

С объявленной таким образом родительской активностью вы можете перейти к соответствующему родительскому элементу, как показано ниже,

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } 

Поэтому, когда вы вызываете NavUtils.navigateUpFromSameTask(this); этот метод завершает текущую деятельность и запускает (или возобновляет) соответствующую родительскую активность. Если целевое родительское действие находится в FLAG_ACTIVITY_CLEAR_TOP стеке задачи, оно FLAG_ACTIVITY_CLEAR_TOP как определено FLAG_ACTIVITY_CLEAR_TOP .

И чтобы отобразить кнопку «Вверх», вы должны объявить setDisplayHomeAsUpEnabled():

 @Override public void onCreate(Bundle savedInstanceState) { ... getActionBar().setDisplayHomeAsUpEnabled(true); } 

Старый ответ: (Без навигации вверх, по умолчанию Back Navigation)

Это произойдет только в том случае, если вы снова запустите Activity A из Activity B.

Использование функции startActivity() .

Вместо этого из Activity A запустите Activity B, используя startActivityForResult() и переопределите onActivtyResult() в Activity A.

Теперь в Activity B просто вызовите finish() на кнопку Up. Итак, теперь вы onActivityResult() на ActivityA’s onActivityResult() без создания Activity A снова ..

У меня была такая же настройка, что и одно и то же нежелательное поведение. Для меня это сработало: добавив следующий атрибут к активности A в Manifest.xml моего приложения:

 android:launchMode="singleTask" 

Подробнее см. В этой статье .

Хотя старый вопрос, вот еще одно (imho самое чистое и лучшее) решение, поскольку все предыдущие ответы не работали для меня, так как я отключил Activity B от виджета .

 public void navigateUp() { final Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) { Log.v(logTag, "Recreate back stack"); TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities(); } else { NavUtils.navigateUpTo(this, upIntent); } } 

[ https://stackoverflow.com/a/31350642/570168 ]

Но также см .: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android

Лучший способ добиться этого – использовать две вещи: call:

 NavUtils.navigateUpFromSameTask(this); 

Теперь для того, чтобы это сработало, вам нужно, чтобы ваше состояние манифеста было в том, что активность A имеет родительскую активность B. Родительская активность ничего не нуждается. В версии 4 и выше вы получите хорошую обратную стрелку без дополнительных усилий (это можно сделать и в более низких версиях, а также с небольшим кодом, я опишу ниже). Вы можете установить эти данные на вкладке manifest-> application в графическом интерфейсе (прокрутите вниз до названия родительской активности и поместите его вручную)

Узел поддержки:

если вы хотите поддержать версию ниже версии 4, вам также необходимо включить метаданные. щелкните правой кнопкой мыши на активности, add-> meta data, name = android.support.PARENT_ACTIVITY и value = your.full.activity.name

для получения хорошей стрелки в более низких версиях:

 getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

обратите внимание, что вам понадобится поддержка версии 7 для поддержки этой работы, но это того стоит!

Я пробовал android:launchMode="singleTask" , но это не помогло. Работал для меня с помощью android:launchMode="singleInstance"

Добавляя к ответу @ LorenCK, измените

 NavUtils.navigateUpFromSameTask(this); 

к приведенному ниже коду, если ваша деятельность может быть инициирована из другого действия, и это может стать частью задачи, запущенной каким-либо другим приложением

 Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { TaskStackBuilder.create(this) .addNextIntentWithParentStack(upIntent) .startActivities(); } else { NavUtils.navigateUpTo(this, upIntent); } 

Это запустит новую задачу и запустит родительскую активность Activity, которую вы можете определить в манифесте, как показано ниже в версии Min SDK <= 15

  

Или используйте parentActivityName если его> 15

Что для меня работало:

  @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onBackPressed(); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onBackPressed() { finish(); } 

в TheRelevantActivity.java и теперь он работает как ожидалось

и да, не забудьте добавить:

getSupportActionbar.setDisplayHomeAsUpEnabled(true); в onCreate()

У меня была аналогичная проблема с использованием android 5.0 с именем плохой родительской активности

    

Я удалил com.example.myfirstapp из имени родительской активности и работал правильно

Добавьте в свою активность информацию о манифесте с атрибутом

 android:launchMode="singleTask" 

хорошо работает для меня

попробуй это:

 Intent intent; @Override public void onCreate(Bundle savedInstanceState) { intent = getIntent(); 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.navigateUpTo(this,intent); return true; } return super.onOptionsItemSelected(item); } 

В classе Java: –

  toolbar = (Toolbar) findViewById(R.id.apptool_bar); setSupportActionBar(toolbar); getSupportActionBar().setTitle("Snapdeal"); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

В манифесте: –

    

Это поможет вам

  @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); 

как задняя печать

android:launchMode="singleTop" в мой манифест и добавив android:launchMode="singleTop" к активности сделал трюк для меня.

Это специально решило мою проблему, потому что я не хотел, чтобы Android создавал новый экземпляр предыдущего действия после нажатия кнопки « Up на панели инструментов – вместо этого я хотел использовать существующий экземпляр предыдущего действия, когда я поднялся по иерархии навигации.

Ссылка: android: launchMode

Попробуйте это решение использовать NavUtils.navigateUpFromSameTask (это); в дочерней деятельности: https://stackoverflow.com/a/49980835/7308789

Используйте finish() в действии для возврата в случае события click.

  • Как скрыть элемент от просмотра Recycler в определенном состоянии?
  • Не найден ресурс, который соответствует указанному имени: attr 'android: keyboardNavigationCluster'. при обновлении до Support Library 26.0.0
  • Отпечаток SHA-1 сертификата хранилища ключей
  • Android: Регистрация ключей API Карт Google: ключ сертификации MD5
  • Службы Google Play Game - невозможно войти в систему
  • Как показать несколько маркеров в MapFragment в Google Map API v2?
  • Android N изменяет язык программным путем
  • Как я могу получить данные с веб-сервера в приложении Android?
  • Как я могу разобрать этот JSON в Android?
  • java.util.zip.ZipException: дубликат записи
  • Общий class для AsyncTask в Android?
  • Interesting Posts

    Facebook Open Graph не очищает кеш

    Swift 3.0: ошибка компилятора при вызове глобальной func min (T, T) в массиве или расширении словаря

    вызывающий thread.start () внутри своего собственного конструктора

    Используете ли вы фигурные скобки для дополнительной проверки?

    Является ли целостность флеш-памяти зависящей от системных ресурсов при чтении / записи (например, CD / DVD)?

    Win8 downgrade – установка Windows 7 «Драйвер не найден»

    Как преобразовать String в Date с помощью SimpleDateFormat?

    Лучший инструмент Ruby on Rails WebSocket

    Pass ArrayList to Activity

    PowerMockito макет одиночного статического метода и возвращаемого объекта

    Какой инструмент я могу использовать для копирования DVD-фильмов?

    Процедура слишком большая

    Передача массива структур для работы c ++

    Как закрепить файлы в командной строке XP без дополнительных инструментов / загрузок

    Как справиться с базовой аутентификацией в WebView

    Давайте будем гением компьютера.