Как закрыть активность и вернуться к предыдущей деятельности в android
У меня есть основное действие, когда я нажимаю кнопку, запускает новое действие, я использовал следующий код:
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
Вышеуказанный код запускался из основного действия.
Теперь в моем новом действии, которое вызывается основным действием, у меня есть кнопка возврата.
Когда я нажимаю на эту кнопку, я хочу, чтобы моя новая активность закрылась, и она должна вернуться к исходному основному действию.
Я попытался позвонить super.finish()
и просто finish()
(из нового действия), но затем закрывает все мое приложение (включая мое основное действие).
Как я могу закрыть активность, которая сейчас находится в фокусе, а затем вернуться к основному действию?
EDITED
Тот факт, что моя кнопка возврата телефона также закрывает все мое приложение, заставляет меня думать, что я неправильно начал вторую операцию?
OK Я смотрел,
Я создал объект "Настройки", который использует тот же код манифеста и тот же код для запуска действия.
Для настроек Действие, когда я нажимаю кнопку "Назад", возвращается в основное действие.
С упомянутым выше действием в основном вопросе он просто покидает мое приложение.
Таким образом, проблема не связана с тем, что код завершает работу, но сама деятельность.
Ответы
Ответ 1
Я думаю, что вы вызываете метод finish()
в MainActivity
перед запуском SettingsActivity
.
Сценарий, который вы описали, будет выполняться двумя способами:
ЯВНО
Вы установили android:noHistory = "true"
для MainActivity
внутри AndroidManifest.xml
, который автоматически вызывает MainActivity
до finish
при нажатии клавиши возврата.
ИЛИ
Перед тем, как переключиться на свою "SettingsActivity", вы вызвали finish()
в своем MainActivity
, который убивает его. Когда вы нажимаете кнопку "Назад", так как в стеке не задано другое действие, оно возвращается на главный экран.
Ответ 2
Вы можете вернуться к предыдущему действию, просто позвонив в конец действия() в своей активности. Обратите внимание, что любой код после вызова finish() будет запущен - вы можете просто сделать возврат после вызова finish(), чтобы исправить это.
Если вы хотите вернуть результаты активности 1, а затем при запуске 2-й операции вам нужно:
startActivityForResults(myIntent, MY_REQUEST_CODE);
Внутри вызываемой активности вы можете получить Intent из параметра onCreate() или использовать
getIntent();
Чтобы вернуть результат в действие один, а затем в действие два сделать
setResult(Activity.RESULT_OK, MyIntentToReturn);
Если у вас нет намерения вернуться, просто скажите
setResult(Activity.RESULT_OK);
Если активность имеет плохие результаты, вы можете использовать Activity.RESULT_CANCELED (это используется по умолчанию). Затем в действии, которое вы делаете
onActivityResult(int requestCode, int resultCode, Intent data) {
// Handle the logic for the requestCode, resultCode and data returned...
}
Для завершения операции два используют те же методы с финишем(), как описано выше, и ваши результаты уже установлены.
Ответ 3
При нажатии на кнопку вы можете позвонить:
super.onBackPressed();
Ответ 4
Если вы используете фрагмент, вы должны использовать
getActivity().onBackPressed();
Если вы используете одну активность, вы можете использовать
finish();
Ответ 5
Это закрывает все приложение:
this.finish();
Ответ 6
попробуйте этот код вместо finish
:
onBackPressed();
Ответ 7
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(this, YourMainActivity.class);
startActivity(intent);
finish();
}
});
Ответ 8
Вы делаете это слишком сложно. Если я понимаю, что вы пытаетесь сделать правильно, встроенная кнопка "назад" и сам Android будут выполнять всю работу за вас: http://developer.android.com/guide/components/tasks-and-back-stack.html
Кроме того, реализация пользовательской кнопки "назад" нарушает основные правила качества приложений UX-N1: http://developer.android.com/distribute/googleplay/quality/core.html
Ответ 9
Я полагаю, что ваше второе действие, вероятно, не связано с вашим основным видом деятельности как с дочерней деятельностью. Проверьте файл AndroidManifest.xml
и посмотрите, содержит ли элемент <activity>
для вашего дочернего действия атрибут android:parentActivityName
. Он должен выглядеть примерно так:
<?xml ...?>
...
<activity
android:name=".MainActivity"
...>
</activity>
<activity
android:name=".ChildActivity"
android:parentActivityName=".MainActivity"
...>
</activity>
...
Ответ 10
Просто не назовите finish()
на MainActivity
, тогда это исключает необходимость переопределять onBackPressed()
в SecondActivity
, если вы не выполняете другие функции в этой функции. Если вы чувствуете "необходимость" для этой кнопки возврата, вы можете просто вызвать finish()
на SecondActivity
, и это приведет вас к вашему MainActivity
, если вы не назовете finish()
на нем
Ответ 11
Я не знаю, действительно ли это полезно или нет, но я боролся с одной и той же проблемой, и я нашел довольно простой способ, используя только глобальную логическую переменную и действие onResume(). В моем случае моя активность C, если щелкнуть по определенной кнопке, должна вызвать финиш() Activity B!
Activity_A → Activity_B → Activity_C
Activity_A (обычно открывается как Activity_B)
Activity_B (при нажатии какой-либо кнопки на Activity_C):
// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs = getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);
its_detail = v;
startActivity(C);
@Override
public void onResume(){
super.onResume();
if(its_detail == true){
finish();
}
}
Итак, всякий раз, когда я нажимаю кнопку в Activity C, она выполняет функцию onResume() "Activity B" и возвращается к Activity A.
Ответ 12
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if ( id == android.R.id.home ) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
Попробуйте, он работает как на кнопке панели инструментов , так и на аппаратной кнопке.
Ответ 13
Мы столкнулись с очень похожей ситуацией.
Занятие 1 (Открытие) → Занятие 2 (Предварительный просмотр) → Занятие 3 (Подробно)
Неправильный ответ "на спине"
- Повторное нажатие устройства на Занятии 3 также закроет Занятие 2.
Я проверил все ответы, опубликованные выше, и ни один из них не сработал. Синтаксис Java для перехода между Упражнением 2 и Упражнением 3 был исправлен.
Свежий от кодирования при вызове стороннего приложения. по деятельности. Мы решили исследовать угол конфигурации, что позволило нам определить причину проблемы.
Область действия: настройка действия 2 (вызывающий абонент).
Основная причина:
android:launchMode="singleInstance"
Решение:
android:launchMode="singleTask"
Очевидно, в этой проблеме "при нажатии на спину" singleInstance рассматривает вызванные действия в одном экземпляре с вызывающим действием, в то время как singleTask позволит вызываемым действиям иметь свою собственную идентичность, достаточную для того, чтобы предназначенное при обратном нажатии функционировало должным образом.
Ответ 14
{ getApplicationContext.finish(); }
Попробуйте этот метод.
Ответ 15
возможно, вы вызываете finish(); в событии кнопки клика, поэтому основное действие закрывается сразу после нажатия кнопки, и когда вы возвращаетесь из следующего действия, приложение выходит из него, потому что основная активность уже закрыта и активной активности нет.
Ответ 16
Finish закрывает все приложение, это то, что я ненавижу в разработке Android, не заканчивается, но это нормально, но они не поддерживают синтаксис ok.
startActivity(intent)
Почему бы не
closeActivity (намерения)
Ответ 17
На методе onCreate вашей деятельности напишите следующий код.
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
Затем переопределите onOptionsItem выбранный метод вашей деятельности следующим образом
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
finish();
}
return super.onOptionsItemSelected(item);
}
И тебе хорошо идти.