Intereting Posts
Поддержка в Android.mk Java.net.UnknownHostException: Не удается разрешить хост «<url>»: нет адреса, связанного с именем хоста, и Конец ввода с символом 0 Android и SQLite: когда использовать точки с запятой для завершения операторов? Eclipse / Android: «Ошибки, выполняемые застройщиком Android Pre Compiler» в проекте … » Как получить точку / координату пользователя, нажав на андроид? Активность с прозрачным фоном NullPointerException доступ к представлениям в onCreate () Правильный способ использования сокетов в приложении для Android Управление эмулятором ddms отключено Увеличивает ли Android намерение Intent при возобновлении действия? Плохая длина массива, менеджер уведомлений вызывает сбой телефона на 4.4 Цвет текущей вкладки TabWidget Светится при касании экрана в андроиде? Android: настройка уровня масштабирования в Картах Google для включения всех точек маркера API для API getChildFragmentManager () для Android <17

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

У меня есть 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, и это не то поведение, в котором я нуждаюсь. Мне нужна активность А, чтобы выглядеть так же, как она выглядела раньше, чем я назвал деятельность Б.

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

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

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

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

Solutions Collecting From Web of "Как я могу вернуться к родительской активности правильно?"

Вы объявили активность A стандартным launchMode в манифестах Android. Согласно документации , это означает следующее:

Система всегда создает новый экземпляр действия в целевой задаче и направляет на нее намерение.

Поэтому система вынуждена воссоздавать активность A (то есть вызывать onCreate ), даже если стек задачи обрабатывается правильно.

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

 android:launchMode="singleTop" 

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

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

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

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

android:parentActivityName

Подобно,

 <!-- The main/home activity (it has no parent activity) --> <activity android:name="com.example.app_name.A" ...> ... </activity> <!-- A child of the main activity --> <activity android:name=".B" android:label="B" android:parentActivityName="com.example.app_name.A" > <!-- Parent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.app_name.A" /> </activity> 

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

 @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); } 

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

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

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

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

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

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

андроид: launchMode = "singleTask"

См. http://www.peachpit.com/articles/article.aspx?p=1874864 для объяснения.

Хотя старый вопрос, вот еще одно (самое лучшее и лучшее) решение, поскольку все предыдущие ответы не работали для меня, так как я отключил активность 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 5.0 с именем плохой родительской активности

 <activity android:name=".DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName=".MainActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> 

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

Я пробовал 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

 <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.app_name.A" /> 

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

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

 android:launchMode="singleTask" 

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

Что сработало для меня, было добавление:

  @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()

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

 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); } 
  @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); 

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

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

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

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

Ссылка: android: launchMode

В классе Java: –

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

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

 <activity android:name=".SubActivity" android:label="@string/title_activity_sub" android:theme="@style/AppTheme" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"></meta-data> </activity> 

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