Кнопка Android Action Вверх и кнопка "Назад"
Я использую Actionbar и кнопку "вверх", чтобы вернуться от элементарной активности к основной активности, которая работает нормально. Аналогично, пользователь может нажать кнопку "назад" системы, чтобы вернуться к основному действию.
В моем основном действии, в onCreate()
данные загружаются из Интернета для отображения при запуске приложения. Я заметил, что, когда я использую кнопку "вверх" Actionbar, чтобы перейти от детали к основной активности, выполняется onCreate()
, перегружая данные. Но onCreate()
не запускается, когда я использую кнопку "Назад" системы, поэтому сразу отображается основной вид активности.
Код, который я использую в подробном действии для реализации кнопки "вверх":
switch (item.getItemId()) {
case android.R.id.home:
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
Я хотел бы, чтобы кнопка "вверх" вела себя как кнопка "назад", а не повторять onCreate()
. Но я не уверен, как это сделать, или какой путь кода используется для возврата к основной активности.
Спасибо!
Ответы
Ответ 1
Вместо того, чтобы начать совершенно новую деятельность, просто закончите работу с деталями, которые вы находитесь в
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
Затем вы вернетесь к предыдущему действию в стеке активности (ваше основное действие), а onCreate не следует называть
Ответ 2
Если вы хотите, чтобы Up сделал именно то, что делает Back, вы можете сделать это:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
Обратите внимание, что реализация по умолчанию onBackPressed()
просто вызывает finish()
, но onBackPressed
может быть переопределена.
Ответ 3
Я думаю, что лучшее решение можно найти в этом сообщении.
Вызов finish()
работает в определенных ситуациях, но может не всегда вызывать описанное поведение в документации, например:
![enter image description here]()
Вызывая
Intent intent = NavUtils.getParentActivityIntent(this);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
NavUtils.navigateUpTo(this, intent);
вы вернетесь к родительской активности в состоянии, в котором вы ее оставили. Если у вас есть плоская структура приложения, она будет действовать так же, как кнопка "Назад".
Ответ 4
для реальной "домашней" функциональности вы должны увидеть демонстрацию api в разделе "Действия приложения/активности/порядка".
причина: что, если у вас есть что-то вроде этого: activity1- > activity2- > activity3, и теперь вы хотите перейти к активности1, нажав кнопку "домой" на панели действий?
Ответ 5
Я считаю, что самый простой способ - переопределить метод getParentActivityIntent для подробного действия с добавлением флага "Intent.FLAG_ACTIVITY_CLEAR_TOP":
@Nullable
@Override
public Intent getParentActivityIntent() {
Intent intent = super.getParentActivityIntent();
if (intent != null) {
return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}
return intent;
}
Ответ 6
Есть другое решение, которое может быть доступно кому-то. У меня было такое же двойное поведение, когда пользователь нажал кнопки Back и ActionbarBack. Я был в порядке с поведением Back btn. Я не хотел, чтобы деятельность была воссоздана. Поэтому я перепробовал метод
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
Прекрасно работает для меня