Android: pulsante Indietro nella barra del titolo


111

In molte app (Calendario, Drive, Play Store) quando tocchi un pulsante e inserisci una nuova attività, l'icona nella barra del titolo si trasforma in un pulsante Indietro, ma per l'app che sto creando, non lo fa. Come faccio a far sì che l'icona ti riporti alla schermata precedente?


Prova getSupportActionBar () nell'esempio di OnCreate qui freakyjolly.com/how-to-add-back-arrow-in-android-activity
Code Spy

Risposte:


145

Ci sono due semplici passaggi per creare un pulsante Indietro nella barra del titolo:

Innanzitutto, rendi selezionabile l'icona dell'applicazione utilizzando il seguente codice nell'attività la cui barra del titolo si desidera avere un pulsante Indietro:

ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

Dopo aver aggiunto il codice sopra, vedrai apparire una freccia indietro a sinistra dell'icona dell'applicazione.

inserisci qui la descrizione dell'immagine

In secondo luogo, dopo aver eseguito quanto sopra, devi ancora creare codice che trarrà vantaggio dall'evento clic. Per fare ciò, tieni presente che, quando fai effettivamente clic sull'icona dell'applicazione, onOptionsItemSelectedviene chiamato un metodo. Quindi, per tornare all'attività precedente, aggiungi quel metodo alla tua attività e inserisci il Intentcodice che ti riporterà all'attività precedente. Ad esempio, supponiamo che l'attività a cui stai cercando di tornare sia chiamata MyActivity. Per tornare ad esso, scrivi il metodo come segue:

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

Questo è tutto!

(Nell'API degli sviluppatori Android, consiglia di scherzare con il manifest e di aggiungere cose come android:parentActivityName. Ma per me non sembra funzionare. Quanto sopra è più semplice e affidabile.)

<meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value=".MainActivity" />

E nella tua attività

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

23
Hai spiegato bene ma se non è sbagliato nel tuo onOptionItemSelected dovresti semplicemente chiamare finish (); nel tuo caso startActivityForResult lancerà la seconda attività e quando torni indietro dalla seconda attività verrai riportato alla prima attività (dove hai premuto l'icona della barra delle azioni)
Yahya Arshad

8
Inoltre, dovresti farlo solo se item.getItemId () è android.R.id.home
bitek

2
Come afferma AS: "L'invocazione del metodo 'actionBar.setDisplayHomeAsUpEnabled (true)' può produrre java.lang.NullPointerException"
statosdotcom

1
Avvertimento! Con una ToolBar actionBar restituisce null con crash. Vedi le risposte di seguito.
CoolMind

5
getActionBar () non ha funzionato per me, l'app si blocca. getSupportActionBar () ha funzionato.
john ktejik

60

usa questo codice

 @Override
 public void onCreate(Bundle savedInstanceState) {
    ...
   getActionBar().setDisplayHomeAsUpEnabled(true);
 } 

dopodiché scrivi questo codice in onOptionsItemSelectedmethod

  int id = item.getItemId();

     if (id==android.R.id.home) {
        finish();
    }

1
getActionBar()mi dà un nullo; sai perché?
msysmilu

3
perché non c'è ActionBar, ad esempio con lo stile <item name = "android: windowActionBar"> false </item> <item name = "android: windowNoTitle"> true </item>
Paul Verest

47

Sono finalmente riuscito ad aggiungere correttamente il pulsante Indietro alla barra delle azioni / barra degli strumenti

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}  

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

    return super.onOptionsItemSelected(item);
}

public boolean onCreateOptionsMenu(Menu menu) {
    return true;
}

3
Questa è l'unica risposta che funziona per me. Grazie @LucyFair
Arda Çebi

2
Stesso. La ringrazio per la risposta.
Maria il

Stesso. Nessuna delle altre risposte funziona. Questa avrebbe dovuto essere la risposta accettata.
El Sushiboi

18

1.- Aggiungi l'attività ad AndroidManifest.xml e assicurati di fornire i metadati:

<activity
    android:name="com.example.myfirstapp.DisplayMessageActivity"
    android:label="@string/title_activity_display_message"
    android:parentActivityName="com.example.myfirstapp.MainActivity" >
    <!-- Parent activity meta-data to support 4.0 and lower -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.myfirstapp.MainActivity" />
</activity>

2.- Aggiungere il seguente codice al metodo onCreate dell'attività:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
} 

3.- Sovrascrivi il metodo statico onOptionsItemSelected e usa il metodo statico NavUtils.navigateUpFromSameTask () per navigare nello stack.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

Tuttavia, l'utilizzo di navigateUpFromSameTask () è adatto solo quando l'app è proprietaria dell'attività corrente (ovvero, l'utente ha iniziato questa attività dalla tua app). Se ciò non è vero e la tua attività è stata avviata in un'attività che appartiene a un'app diversa, spostandoti verso l'alto dovresti creare una nuova attività che appartiene alla tua app, che richiede la creazione di un nuovo back stack.


Grazie per aver presentato NavUtils!
AntonSack

10

Se la tua attività estende Activity

public class YourActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xxx);

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}

Se la tua azione estende AppCompatActivity

public class YourActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_xxx);

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

Niente più da fare, vedi Add up action

[FACOLTATIVO] Per definire in modo esplicito l'attività principale, modifica il file Manifest.xml in questo modo:

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.YourActivity "
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

Vedere Specificare l'attività principale


1
Questo è esattamente quello che stavo cercando. Mi hai salvato la giornata. Molte grazie.
Tashi Dendup

6

Se la tua attività si estende, AppCompatActivitydevi sovrascrivere il onSupportNavigateUp()metodo in questo modo:

public class SecondActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_second);
       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
       getSupportActionBar().setHomeButtonEnabled(true);
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       ...
   }

   @Override
   public void onBackPressed() {
       super.onBackPressed();
       this.finish();
   }

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

Gestisci la tua logica nel tuo onBackPressed()metodo e chiama semplicemente quel metodo in onSupportNavigateUp()modo che il pulsante Indietro sul telefono e la freccia sulla barra degli strumenti facciano la stessa cosa.


6

prima di tutto nella funzione onCreate aggiungere la seguente riga

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

e quindi aggiungi la seguente funzione nel codice:

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

        return super.onOptionsItemSelected(item);
    }

6

Per prima cosa devi scrivere questi codici

@Override
    protected void onCreate(Bundle savedInstanceState) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

Quindi aggiungi questa riga nel file manifest

 <activity android:name=".MainActivity"
            android:parentActivityName=".PreviousActivity"></activity>

penso che funzionerà


5

Se stai usando la nuova libreria di supporto per 5.1 in Android Studio, puoi invece usarla su AppCompatActivity

 ActionBar actionBar = getSupportActionBar();
 actionBar.setHomeButtonEnabled(true);
 actionBar.setDisplayHomeAsUpEnabled(true);
 actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
 actionBar.setDisplayShowHomeEnabled(true);

Saluti.


5

Il modo più semplice e la migliore pratica come Google spiega qui :

1.Aggiungi un genitore per tuo figlio Attività nel AndroidManifest.xml:

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

2.Attiva il pulsante Indietro nel tuo bambino Attività:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

Ha funzionato per me, spero che funzioni anche per te.


questo è valido solo se l'attività può avere solo un'attività genitore. Questo è il caso per me. +1
MQoder

Il passaggio 2 non è stato richiesto nel mio caso.
Thomio

5

Dopo un po 'di tempo che ho trovato, l'opzione del tema è il problema principale nel mio codice E il seguente è il modo corretto per mostrare la barra degli strumenti per me

Nel file AndroidManifest devi prima cambiare lo stile del tema

Theme.AppCompat.Light.DarkActionBar
to 
Theme.AppCompat.Light.NoActionBar

quindi alla tua attività xml devi chiamare la tua Toolbar come

<androidx.appcompat.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:elevation="4dp"/>

E poi questa barra degli strumenti dovrebbe essere chiamata nel tuo file Java da

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

E per la barra degli strumenti che mostra U dovrebbe controllare il null per evitare NullPointerException

if(getSupportActionBar() != null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Per l'attività a casa, aggiungi questo

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

        return super.onOptionsItemSelected(item);
    }

O per la tua attività desiderata indietro

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), YourActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

3

Ho visto così tanti complessi rispondere, quindi questo è il mio codice. Lavorando qui. Puoi ottenerlo in due modi.

1) Compatibilità con Android Stardard

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;

import android.view.MenuItem;
import android.view.View;

public class EditDiscoveryActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_discovery);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        /*toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });*/
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

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

}

2) Usa un'icona personalizzata

Se vuoi usare il codice nei commenti devi solo aggiungere questo file in drawable, chiamato ic_arrow_white_24dp.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#ffffff"
        android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
    </vector>

Con questo codice.

toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    finish();
                }
            });

Spero che possa aiutare alcune persone qui!


2

Versione leggera senza utilizzo ActionBarActivityche ha ancora gli stessi bahaviors qui:

public class ToolbarConfigurer implements View.OnClickListener {
    private Activity activity;

    public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
        toolbar.setTitle((this.activity = activity).getTitle());
        if (!displayHomeAsUpEnabled) return;
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        toolbar.setNavigationOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        NavUtils.navigateUpFromSameTask(activity);
    }
}

Uso: Put new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);in onCreate.


Ciò si adatta al nuovo widget della barra degli strumenti che è incluso nella libreria di supporto. Grazie!!
Clocker

2

È necessario aggiungere il codice indicato di seguito nel file manifest. Cerca l'attività in cui desideri aggiungere la funzionalità freccia indietro. Se trovi quello, allora va bene o crea l'attività

<activity android:name=".SearchActivity">

</activity>

Quindi aggiungi le seguenti tre righe di codice in mezzo.

<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.raqib.instadate.MainActivity" />

E non dimenticare di aggiungere questo pezzo di codice in onCreate (); metodo della tua particolare attività in cui hai bisogno della freccia indietro.

        Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
    setSupportActionBar(toolbar);
    try{
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }catch(NullPointerException e){
       Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
    }

Ecco come ho risolto il problema. Grazie.


2

Le altre risposte non menzionano che puoi anche impostarlo nell'XML del tuo Toolbarwidget:

app:navigationIcon="?attr/homeAsUpIndicator"

Per esempio:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:navigationIcon="?attr/homeAsUpIndicator"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:title="@string/title_activity_acoustic_progress" />

2

Tutto quello che devi fare nel 2020:
(considerando che vuoi tornare alla MainActivity)

protected void onCreate(Bundle savedInstanceState){
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

public boolean onOptionsItemSelected(MenuItem item) {
    Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

È interessante, ma stai assumendo che vogliamo tornare a MainActivity. Come reindirizzeresti a qualsiasi attività precedente?
mayid


1

Può anche essere fatto senza codice specificando un'attività genitore nel manifesto dell'app Se vuoi un pulsante Indietro nell'attività B che andrà all'attività A, aggiungi semplicemente l'attività A come genitore dell'attività B nel manifest.


1

Per kotlin:

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        onBackPressed();
        return true;
    }

1

Avevo bisogno di mescolare alcune risposte per ottenere la risposta giusta per me perché la mia app ha 3 attività che possono andare e tornare in qualsiasi momento. Attività1> Attività2> Attività3. Quando stavo facendo qualcosa sulla mia attività3, il pulsante Indietro tornava correttamente su Attività2. Tuttavia, dall'Attività2, l'utilizzo finish(), era il backup dell'Attività3 e non dell'Attività1. E sto estendendo AppCompatActivity. Quindi, la mia soluzione era:

public class Activity2 extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...

            getSupportActionBar().setHomeButtonEnabled(true);
        }
    }

su AndroidManifest.xml:

<activity android:name=".activities.Activity2"
           android:parentActivityName="com.example.appname.activities.Activity1">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.appname.activities.Activity1" />
        </activity>

e infine, il pulsante di azione nel mio menu (barra delle azioni):

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            ...

            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;

        }

        return super.onOptionsItemSelected(item);

    }

L'uso ha NavUtils.navigateUpFromSameTask(this);funzionato per me, invece di finish().


1

Condivido solo qualcosa che mi ha aiutato e potrebbe essere utile per gli altri. Sebbene la maggior parte delle risposte qui siano corrette, utilizzando il getActionBar().setDisplayHomeAsUpEnabled(true);, non funzionava per me. Il problema che ho avuto era che stavo cercando di creare una seconda attività manualmente, ma sono coinvolti più dettagli.
Ciò che ha veramente risolto il mio problema è stato seguire il tutorial per sviluppatori Android ( https://developer.android.com/training/basics/firstapp/starting-activity ) per creare una seconda attività utilizzando gli strumenti di Android Studio:

Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.

0

Puoi anche semplicemente inserire il onBackPressed()tuo listener onClick. Questo fa sì che il tuo pulsante si comporti come i pulsanti di "backup / backup" predefiniti nelle app Android!


0
Toolbar toolbar=findViewById(R.id.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

if (getSupportActionBar()==null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
}

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

0

Questo funziona per me .. Supponiamo che ci siano due attività (Activityone, Activitytwo)

All'interno di Activitytwo usa questo codice

@Override
protected void onCreate(Bundle savedInstanceState) {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Su Activityone

//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));

Questo dovrebbe essere incluso nella seconda attività all'interno del file manifest

<activity android:name=".Activitytwo"
        android:parentActivityName=".Activityone"></activity>

E il risultato sarebbe così

inserisci qui la descrizione dell'immagine


0
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YourxmlFileName);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

  public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id==android.R.id.home) {
            finish();
            return true;
        }
        return false;
    }

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.