как переопределить кнопку возврата на панели действий в Android?

95

Я хочу настроить кнопку возврата активности на панели действий, а не кнопку возврата с аппаратной клавишей. Я отверг onBackPressed()метод. Он работает с моей кнопкой возврата эмулятора, но не с кнопкой возврата на панели действий.

Я хочу, чтобы это произошло с панелью действий. Как я могу это сделать?

Вот мой код:

@Override
public void onBackPressed() {
    Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
    return;
}

Я использовал этот тост независимо от того, работает ли нажатие кнопки или нет, но фактические изменения реализации, например, возвращение к предыдущему действию. Но это не работает с кнопкой, присутствующей в верхней части панели действий (помимо заголовка действия).

Пожалуйста, любой может указать мне проблему.

GK
источник

Ответы:

211

Я думаю, вы хотите отменить нажатие кнопки «Домой». Вы можете переопределить эту функцию в своей деятельности.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
        break;
    }
    return true;
}
Ибрахимьылмаз
источник
1
Ной Ибрагим, на самом деле в левом верхнем углу есть кнопка «Назад», как и в браузере. Когда я нажимаю на эту кнопку, я хочу вернуться к предыдущему действию. Не похоже на код, опубликованный выше.
GK
4
добавить super.onBackPressed (); to it
redestructa
2
Это сработало для меня после того, как я перешел return true;на return super.onOptionsItemSelected(item). Затем вы можете заставить что-то происходить, когда пользователь нажимает кнопку «Назад» на панели действий, но при этом сохраняет ту же функциональность, что и кнопка.
kumaheiyama
По этой технике кнопка со стрелкой назад реагирует поздно. Означает, что мне нужно подождать секунду, чтобы запустить событие. Также не появляется селектор на этой кнопке для эффекта при ее нажатии
Гопал Сингх Сирви
У меня не получилось. Когда я отлаживал, я обнаружил, что идентификаторы кнопки «Домой» и идентификатор кнопки были разными.
viper
46

Если вы хотите, чтобы кнопка возврата ActionBar работала так же, как аппаратная кнопка возврата:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home) {
                    onBackPressed();
                    return true;
            }
            return false;
    }
ruX
источник
1
чехол android.R.id.homeне стреляет
Trancer 01
2
@Trancer, если вы используете его во фрагменте, вы должны дополнительно вызвать setHasOptionsMenu(true)метод
onCreate
10

Следует иметь в виду две вещи: пользователь может либо нажать кнопку «Назад», либо нажать кнопку «Домой» на панели действий.
Итак, если вы хотите перенаправить его в тот же пункт назначения, вы можете это сделать.

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

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
    startActivity(intent);
    finish();
}

Это приведет пользователя к намерению нажать либо клавишу, либо кнопку панели действий.

ССи-Аник
источник
чехол android.R.id.homeне стреляет
Trancer 01
@Trancer, Прошло уже почти 1,5+ года. А андроидом сейчас не занимаюсь. Я не могу тебе помочь сейчас. Сожалею.
ssi-anik
так какое решение?
GA1
7
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case android.R.id.home:
                       finish();
                   break;
                }
                return true;
        }
Крунал Шах
источник
2
Вы могли бы добавить это как комментарий. Это более или менее похоже на принятый ответ.
Суфиан,
7

Извините, мой ответ был запоздалым, но для всех, кто пришел на эту страницу с тем же вопросом, я попробовал следующее:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
  ...
  if (item.getItemId() == android.R.id.home) {
    ....
  }
  ....
}

но при этом не удалось поймать нажатие кнопки "Назад".

В конце концов я нашел метод, который работал у меня на https://stackoverflow.com/a/37185334/3697478, который должен переопределить «onSupportNavigateUp ()», поскольку я использую панель действий из библиотеки поддержки «AppCompatActivity». (Существует эквивалент «onNavigateUp ()» для новой библиотеки панели действий / панели инструментов.)

@Override
public boolean onSupportNavigateUp(){  
  finish();  
  return true;  
}

и я удалил раздел "android: parentActivityName =". MainActivity "из файла манифеста.

Стивен Бриджитт
источник
4

Я добился этого, выполнив всего два шага,

Шаг 1. Перейдите в AndroidManifest.xml и добавьте параметр в тег - android: parentActivityName = ". Home.HomeActivity"

пример :

 <activity
    android:name=".home.ActivityDetail"
    android:parentActivityName=".home.HomeActivity"
    android:screenOrientation="portrait" />

Шаг 2: в ActivityDetail добавьте действие для предыдущей страницы / действия

пример :

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
       case android.R.id.home:
           onBackPressed();
           return true;
    }
    return super.onOptionsItemSelected(item);
 }
Вивек Ханде
источник
2

Если вы хотите вернуться к предыдущему экземпляру Activity , нажав домашнюю кнопку ActionBar, не создавая его заново, вы можете переопределить метод getParentActivityIntent, чтобы использовать метод из заднего стека:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public Intent getParentActivityIntent() {
      return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}

РЕДАКТИРОВАТЬ:
Вы также можете добиться того же результата,
установив для параметра launchMode родительского действия значение singleTop.
Итак, установите android:launchMode="singleTop"родительскую активность в своем манифесте.
Или вы можете использовать флаг FLAG_ACTIVITY_CLEAR_TOP с намерением ВВЕРХ.
ссылка: Обеспечение навигации вверх

Лев Дроидкодер
источник
2

(1) Добавьте родительскую активность для вашей дочерней активности (AndroidManifest.xml)

<activity
        android:name=".ParentActivity" />

(2) переопределить метод onSupportNavigateUp внутри дочернего действия

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return false;
}
Харихаран Канакараджа
источник
0
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
        return true;
    }
    //noinspection SimplifiableIfStatement
    if (id == R.id.signIn) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
///////////////////
@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}
Рошан Курбан
источник
0

Есть несколько способов настроить кнопку возврата на панели:

1) метод .setDisplayHomeAsUpEnabled(true);сделает это, а затем вы можете просто переопределитьandroid.R.id.home

2) добавление <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />в Android Manifest, но в этом случае вы не можете переопределить android.R.id.homeв OnOptionsMenuSelected.

.. для тех, кто задается вопросом, почему у них не работает ...

Иржи
источник