come ignorare il pulsante Indietro della barra delle azioni in Android?


95

Desidero personalizzare il pulsante Indietro dell'attività nella barra delle azioni, non nel pulsante Indietro del tasto fisso. Ho ignorato il onBackPressed()metodo. Funziona con il pulsante Indietro dell'emulatore, ma non con il pulsante Indietro della barra delle azioni.

Voglio che accada con la barra delle azioni. Come posso fare questo?

Ecco il mio codice:

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

Ho usato questo avviso sia che il back premuto stia funzionando o meno, ma l'implementazione effettiva cambia come per tornare all'attività precedente. Ma questo non funziona con il pulsante presente nella parte superiore della barra delle azioni (oltre al titolo dell'attività).

Per favore, chiunque potrebbe specificarmi il problema.

Risposte:


209

Penso che tu voglia sovrascrivere l'operazione di clic del pulsante home. Puoi ignorare questa funzionalità in questo modo nella tua attività.

@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
Noah Ibrahim, In realtà c'è il pulsante Indietro nell'angolo in alto a sinistra come il pulsante Indietro nel browser. Quando clicco su quel pulsante, voglio tornare all'attività precedente. Non come il codice che hai postato sopra.
GK

4
aggiungi super.onBackPressed (); ad esso
redestructa

2
Questo ha funzionato per me dopo che sono passato return true;a return super.onOptionsItemSelected(item). Quindi puoi far accadere qualcosa quando l'utente fa clic sul pulsante Indietro della barra delle azioni, ma conserva comunque la stessa funzionalità del pulsante.
kumaheiyama

Con questa tecnica il pulsante freccia indietro risponde in ritardo. Significa che devo aspettare un secondo per attivare l'evento. Inoltre non appare il selettore su questo pulsante per l'effetto mentre lo si preme
Gopal Singh Sirvi

Non ha funzionato per me. Quando ho eseguito il debug, ho trovato gli ID del pulsante Home e l'ID del pulsante selezionati in modo diverso.
Viper

45

Se desideri che il pulsante Indietro di ActionBar si comporti allo stesso modo del pulsante Indietro hardware:

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

1
caso android.R.id.homenon spara
Trancer

2
@Trancer se lo usi in Fragment, dovresti anche chiamare setHasOptionsMenu(true)il metodo onCreate di fragment
wilddev

10

Due cose da tenere a mente che l'utente può premere il pulsante Indietro o premere il pulsante Home della barra delle azioni.
Quindi, se vuoi reindirizzarlo alla stessa destinazione, puoi farlo.

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

Questo porterà l'utente all'intento premendo il tasto o il pulsante della barra delle azioni.


il caso android.R.id.homenon si
attiva

@Trancer, sono passati quasi più di 1,5 anni. E adesso non uso Android. Non posso aiutarti adesso. Scusate.
ssi-anik

quindi qual è la soluzione?
GA1

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

2
Potresti averlo aggiunto come commento. È più o meno la stessa della risposta accettata.
Sufian

7

Scusa la mia è una risposta tardiva, ma per chiunque sia arrivato a questa pagina con la stessa domanda, ho provato quanto sopra:

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

ma questo non è riuscito a catturare la pressione del pulsante "Indietro".

Alla fine ho trovato un metodo che ha funzionato per me su https://stackoverflow.com/a/37185334/3697478 che è sovrascrivere "onSupportNavigateUp ()" poiché sto utilizzando la barra delle azioni dalla libreria di supporto "AppCompatActivity". (Esiste un equivalente "onNavigateUp ()" per la più recente libreria della barra delle azioni / barra degli strumenti.)

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

e ho rimosso la sezione "android: parentActivityName =". MainActivity "dal file manifest.


4

Ho raggiunto questo obiettivo, utilizzando semplicemente due passaggi,

Passaggio 1: vai su AndroidManifest.xml e aggiungi il parametro nel tag - android: parentActivityName = ". Home.HomeActivity"

esempio :

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

Passaggio 2: in ActivityDetail aggiungi la tua azione per la pagina / attività precedente

esempio :

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

2

Se desideri tornare all'istanza precedente di un'attività premendo il pulsante Home di ActionBar, senza ricrearlo , puoi sovrascrivere il metodo getParentActivityIntent per utilizzare quello dallo stack precedente:

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

EDIT:
Inoltre puoi ottenere lo stesso risultato
impostando il launchMode dell'attività genitore su singleTop.
Quindi imposta android:launchMode="singleTop"l'attività dei genitori nel tuo manifest.
Oppure puoi utilizzare il flag FLAG_ACTIVITY_CLEAR_TOP con l'intento UP.
riferimento: Fornire la navigazione


2

(1) Aggiungi l'attività genitore per l'attività del tuo bambino (AndroidManifest.xml)

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

(2) sovrascrivere il metodo onSupportNavigateUp all'interno dell'attività figlio

@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

Esistono diversi modi per impostare il pulsante Indietro nella barra:

1) il metodo .setDisplayHomeAsUpEnabled(true);lo farà, quindi puoi semplicemente eseguire l'overrideandroid.R.id.home

2) aggiungendo <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />in Android Manifest, ma in questo caso non è possibile sovrascrivere android.R.id.homein OnOptionsMenuSelected.

.. per coloro che si chiedono perché non funziona per loro ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.