як замінити кнопку назад панелі дій в android?


95

Я хочу налаштувати кнопку "Назад" на панелі дій, а не на кнопці "Назад". Я перевизначив onBackPressed()метод. Він працює з моєю кнопкою повернення емулятора, але не з кнопкою назад панелі дій.

Я хочу, щоб це сталося із панеллю дій. Як я можу це зробити?

Ось мій код:

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

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

Будь ласка, будь-хто може вказати мені проблему.

Відповіді:


210

Я думаю, ви хочете замінити натискання кнопки додому. Ви можете замінити цю функцію, як це, у своїй діяльності.

@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
Ноа Ібрагім, насправді є кнопка "Назад" у верхньому лівому куті, як кнопка "Назад" у браузері. Коли я натискаю цю кнопку, я хочу повернутися до попередньої діяльності. Не схожий на код u, розміщений вище.
GK

4
додати super.onBackPress (); до нього
redestructa

2
Це спрацювало для мене після того, як я змінився return true;на return super.onOptionsItemSelected(item). Тоді ви можете зробити щось, коли користувач натисне кнопку назад на панелі дій, але при цьому збереже ті самі функції, що й кнопка.
кумахеіяма

За допомогою цієї техніки кнопка зі стрілкою назад реагує пізно. Означає, що мені потрібно почекати секунду, щоб звільнити подію. Також не з'являється селектор на цій кнопці для ефекту під час натискання
Gopal Singh Sirvi

Не працював у мене. Коли я налагоджував, я виявив, що ідентифікатори кнопки додому та ідентифікатора кнопки натиснуті різні.
гадюка

45

Якщо ви хочете, щоб кнопка "Назад" ActionBar поводилася так само, як і кнопка "Назад":

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

1
справа android.R.id.homeне стріляє
Трансер

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, Пройшло майже 1,5+ року. І я зараз не займаюся андроїдом. Зараз я не можу тобі допомогти. Вибачте.
ssi-anik 02

то яке рішення?
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 , натиснувши кнопку HomeBar ActionBar, не відтворюючи його, ви можете замінити метод getParentActivityIntent, щоб використовувати той із заднього стеку:

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

РЕДАГУВАТИ:
Також ви можете досягти того самого результату,
встановивши режим запуску вашої батьківської діяльності на singleTop.
Тож встановіть android:launchMode="singleTop"у своєму маніфесті батьківську активність.
Або ви можете використовувати прапор FLAG_ACTIVITY_CLEAR_TOP із наміром UP.
посилання: Забезпечення навігації


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.

.. для тих, хто дивується, чому у них це не працює ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.