Visualizza il pulsante Indietro sulla barra delle azioni


181

Sto cercando di visualizzare una Back buttonsulla Action barspostare pagina precedente / attività o alla pagina principale (prima apertura). E non posso farlo.

il mio codice.

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

il codice è in onCreate.


19
Utilizzare: getSupportActionBar (). SetDisplayHomeAsUpEnabled (true);
Sukitha Udugamasooriya,

@SukithaUdugamasooriya Grazie mille
Sardorbek Rkh

Risposte:


207

bene questo è semplice da mostrare il pulsante indietro

actionBar.setDisplayHomeAsUpEnabled(true);

e quindi puoi personalizzare l'evento back su onOptionsItemSelected

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

ho aggiunto le righe sopra all'interno di onOptionsItemSelected (voce MenuItem), poiché ho già un menu sull'azione errato sto elencando gli ID per reindirizzare le opzioni di menu, l'id home non funziona quando si fa clic

Se si verificano comportamenti strani (come in: si utilizza il pulsante Indietro (R.id.home) di un frammento e si finisce per chiudere l'attività), assicurarsi di NON avere "android: noHistory" impostato su questa attività, perché se sì, anche tornare da un frammento alla "panoramica" dell'attività lo finirà.
Igor,

2
Assicurati di impostare l'attività principale in AndroidMenifest.xml affinché il pulsante R.id.home funzioni.
Leap Hawk,

192

penso onSupportNavigateUp() sia il modo migliore e più semplice per farlo, controlla i passaggi seguenti. Il passaggio 1 è necessario, il passaggio due ha un'alternativa.

Passaggio 1 che mostra il pulsante Indietro: aggiungi questa riga nel onCreate()metodo per mostrare il pulsante Indietro.

assert getSupportActionBar() != null;   //null check
getSupportActionBar().setDisplayHomeAsUpEnabled(true);   //show back button

Passaggio 2: implementazione del back click: sovrascrivi questo metodo

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

Ecco fatto
O OPZIONE 2 Alternativa: è possibile aggiungere meta all'attività nel file manifest come

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

Modifica: se non si utilizza l' AppCompatattività, non utilizzare la supportparola, è possibile utilizzare

getActionBar().setDisplayHomeAsUpEnabled(true); // In `OnCreate();`

// And override this method
@Override 
public boolean onNavigateUp(){ 
     finish(); 
     return true; 
}

Grazie a @atariguy per il commento.


2
Questa soluzione funziona benissimo quando è necessario rispedire i dati all'attività padre o se si desidera conservare i valori di EditText nell'attività padre. Ho provato onOptionsItemSelectedsoluzioni ma non ci sono riuscito.
weeix,

3
Migliore soluzione +10.
Satheeshwaran,

3
Se non stai utilizzando la libreria di supporto per la barra delle azioni, modifica come segue: getActionBar().setDisplayHomeAsUpEnabled(true); @Override public boolean onNavigateUp(){ finish(); return true; }
atariguy

1
Fenomenale. +1. Semplice. Elegante. Bellissimo. :)
Rohit Kumar il

1
Grazie per l'aiuto. Usando manifest, non funzionava ma usava il codice che stava funzionando
santosh devnath,

70

La magia accade dentro onOptionsItemSelected.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; go home
            Intent intent = new Intent(this, HomeActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

1
Nel mio caso, voglio aggiungere il pulsante Indietro in quella pagina in cui l'evento onOptionsItemSelected (voce MenuItem) non sarà presente ... C'è qualche altra soluzione per questo ??
Vidhi,

1
Devi prima aggiungere il getActionBar().setDisplayHomeAsUpEnabled(true);tuo onCreateMethod per il pulsante Visualizza indietro
aletede91

1
Penso che se lo fai in questo modo, non torni indietro anche se riavvii l'attività precedente avendone ora un'istanza in più e vai sempre avanti e avanti fino a quando non si verifica un overflow dello stack se continui abbastanza a lungo. Penso che la risposta di Igor sia corretta, dovresti interrompere questa attività con finish () e lasciare che framework ti riporti alla precedente istanza di attività in esecuzione.
Reijo Korhonen,

2
utilizzare il this.onBackPressed();metodo quando l'utente fa clic sul pulsante Indietro.
CaptRisky,

47

Soluzione ufficiale

Aggiungi quei due frammenti di codice alla tua attività secondaria

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

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

aggiungere metadati e parentActivity per manifest per supportare il sdk inferiore.

 <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.SubActivity"
        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>

Riferimento qui: http://developer.android.com/training/implementing-navigation/ancestral.html


5
Nota: se si utilizzano le librerie di supporto per la retrocompatibilità, sarà necessario utilizzare "getSupportActionBar ()" anziché "getActionBar ()". Questa è la risposta più completa e ufficiale.
Christopher Bull,

32

Aggiungi queste righe a onCreate ()

android.support.v7.app.ActionBar actionBar = getSupportActionBar();
   actionBar.setHomeButtonEnabled(true);
   actionBar.setDisplayHomeAsUpEnabled(true);

e in onOptionItemSelected

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                //Write your logic here
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

Spero che questo ti possa aiutare ..!


27

Prova questo codice, lo considera solo se hai bisogno del pulsante Indietro.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //YOUR CODE
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //YOUR CODE
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

17

Nel tuo onCreatemetodo aggiungi:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Durante la definizione AndroidManifest.xmldell'attività principale (l'attività che verrà chiamata una volta premuto il pulsante Indietro nella barra delle azioni):

Nella tua <activity>definizione sul Manifest, aggiungi la riga:

android:parentActivityName="com.example.activities.MyParentActivity"

Devi solo inserire il codice manifest se stai cercando di supportare dispositivi pre-4.0. Il primo bit di codice è una soluzione migliore per le librerie attuali.
Louie Bertoncin,

8

So di essere un po 'in ritardo, ma sono stato in grado di risolvere questo problema seguendo direttamente i documenti .

Aggiungi il tag meta-data a AndroidManifest.xml(così il sistema lo sa)

 <activity
        android:name=".Sub"
        android:label="Sub-Activity"
        android:parentActivityName=".MainChooser"
        android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainChooser" />
    </activity>

Quindi, abilita il pulsante Indietro (su) nel tuo MainActivity

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_child);
 
    // my_child_toolbar is defined in the layout file 
    Toolbar myChildToolbar =
        (Toolbar) findViewById(R.id.my_child_toolbar);
    setSupportActionBar(myChildToolbar);
 
    // Get a support ActionBar corresponding to this toolbar 
    ActionBar ab = getSupportActionBar();
 
    // Enable the Up button 
    ab.setDisplayHomeAsUpEnabled(true);
    } 

E sarai pronto!

Fonte: documentazione per sviluppatori Android


6

So che quanto sopra sono molte soluzioni utili, ma questa volta ho letto questo articolo (l'attuale Android Studio 2.1.2 con SDK 23) alcuni metodi sopra non funzionano.

Di seguito è la mia soluzione per l'attività secondaria è MapsActivity

Innanzitutto, devi aggiungere parentActivity in

AndroidManifest.xml

come questo :

<application ... >
    ...
    <!-- Main activity (which has no parent activity) -->
    <activity
        android:name="com.example.myapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        .....
        android:parentActivityName=".MainActivity" >
        <!-- Support Parent activity for Android 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myapp.MainActivity" />
    </activity>
</application>

In secondo luogo, assicurati che l'attività secondaria si estenda AppCompatActivity, non FragmentActivity.

Terzo, sostituire il onOptionsItemSelected()metodo

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon action bar is clicked; go to parent activity
                this.finish();
                return true;
            case R.id.action_settings:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

Spero che questo possa aiutare!


4

Prova questo, nel tuo onCreate ()

 getActionBar().setHomeButtonEnabled(true);
 getActionBar().setDisplayHomeAsUpEnabled(true);

E per clickevent,

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon in action bar clicked; goto parent activity.
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

4

Per raggiungere questo obiettivo, ci sono semplicemente due passaggi,

Passaggio 1: vai a AndroidManifest.xmle aggiungi questo parametro nel <activity>tag -android:parentActivityName=".home.HomeActivity"

Esempio:

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

Passaggio 2: ActivityDetailaggiungi il tuo actionper 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);
}

4

nel metodo onCreate scrivi-

Toolbar toolbar = findViewById(R.id.tool);
    setSupportActionBar(toolbar);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
@Override
public void onBackPressed() {
    super.onBackPressed();
    startActivity(new Intent(ActivityOne.this, ActivityTwo.class));
    finish();
}

e questo è il file XML

<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:id="@+id/tool">

e in styles.xml modificalo in

Theme.AppCompat.Light.NoActionBar

questo è tutto ciò che dobbiamo fare.


4

Questo è semplice e funziona molto bene per me

aggiungi questo metodo onCreate ()

getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

aggiungi questo metodo oncreate () esterno

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

3

Nel tuo onCreate()metodo aggiungi questa riga

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

e, nella stessa attività, aggiungere questo metodo per gestire il clic sul pulsante

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

2

Ho risolto in questo modo

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

@Override
public void onBackPressed(){
    Intent backMainTest = new Intent(this,MainTest.class);
    startActivity(backMainTest);
    finish();
}

1

il mio codice di lavoro per tornare indietro.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home:

        Toast.makeText(getApplicationContext(), "Home Clicked",
                Toast.LENGTH_LONG).show();

        // go to previous activity
        onBackPressed();

        return true;

    }

    return super.onOptionsItemSelected(item);
}

1
 public void initToolbar(){
       //this set back button 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       //this is set custom image to back button
       getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_btn_image);
}


//this method call when you press back button
@Override
public boolean onSupportNavigateUp(){
    finish();
    return true;
}

1
ActionBar actionBar=getActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

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

    return super.onOptionsItemSelected(item);
}

1

Potrebbe essere troppo tardi per rispondere, ma secondo me ho una soluzione più breve e più funzionale.

// Inside your onCreate method, add these.
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);

// After the method's closing bracket, add the following method exactly as it is and voiulla, a fully functional back arrow appears at the action bar
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

1

In oncreate (); scrivi questa riga->

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

quindi implementare il metodo seguente in quella classe

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case android.R.id.home:
        // app icon in action bar clicked; go home
      onBackPressed();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

1

manifest.xml

<activity
            android:name=".Activity.SecondActivity"
            android:label="Second Activity"
            android:parentActivityName=".Activity.MainActivity"
            android:screenOrientation="portrait"></activity>

1

Per visualizzare il pulsante Indietro della barra delle azioni in Kotlin ci sono 2 modi per implementarlo

1. utilizzando la barra delle azioni predefinita fornita da Android - La tua attività deve utilizzare un tema con la barra delle azioni, ad esempio: Theme.AppCompat.Light.DarkActionBar

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val actionBar = supportActionBar
    actionBar!!.title = "your title"
    actionBar.setDisplayHomeAsUpEnabled(true)
    //actionBar.setDisplayHomeAsUpEnabled(true)
}

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

2. Progetta la tua barra delle azioni - disabilita la barra delle azioni predefinita - ad esempio: Theme.AppCompat.Light.NoActionBar - aggiungi il layout al tuo activity.xml

    <androidx.appcompat.widget.Toolbar
     android:id="@+id/main_toolbar"
     android:layout_width="match_parent"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent">

     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:layout_editor_absoluteX="16dp">

         <TextView
             android:id="@+id/main_toolbar_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="Your Title"
             android:textSize="25sp"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.5"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />

     </androidx.constraintlayout.widget.ConstraintLayout>
 </androidx.appcompat.widget.Toolbar>
  • onCreate
override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)

     setSupportActionBar(findViewById(R.id.main_toolbar))
 }
  • crea il tuo pulsante
<?xml version="1.0" encoding="utf-8"?>
<menu
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto" >

 <item
     android:id="@+id/main_action_toolbar"
     android:icon="@drawable/ic_main_toolbar_item"
     android:title="find"
     android:layout_width="80dp"
     android:layout_height="35dp"
     app:actionLayout="@layout/toolbar_item"
     app:showAsAction="always"/>

</menu>
  • in YourActivity.kt
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
     menuInflater.inflate(R.menu.main_toolbar_item, menu)

     leftToolbarItems = menu!!.findItem(R.id.main_action_toolbar)
     val actionView = leftToolbarItems.actionView
     val badgeTextView = actionView.findViewById<TextView>(R.id.main_action_toolbar_badge)
     badgeTextView.visibility = View.GONE

     actionView.setOnClickListener {
         println("click on tool bar")
     }
     return super.onCreateOptionsMenu(menu)
 }

0

Aggiungi sotto il codice nella funzione onCreate:

getSupportActionBar () setDisplayHomeAsUpEnabled (true).;

E quindi sovrascrivere: @Override onOptionsItemSelected pubblico booleano (elemento MenuItem) {onBackPressed (); ritorno vero; }


0

Nella versione aggiornata getActionBar () non funziona!

Invece, puoi farlo in questo modo

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

Aggiungi il pulsante Indietro nella barra del titolo Android per aiutarti nel 2020


Le tue ultime due risposte rimandano entrambe allo stesso sito. Sei associato / affiliato a quel sito in qualche modo? Se sei affiliato, devi rivelare tale affiliazione nel post . Se non divulga l'affiliazione, viene considerato spam. Vedi: Cosa significa autopromozione "buona"? , alcuni suggerimenti e consigli sull'autopromozione , Qual è la definizione esatta di "spam" per StackTranslate.it? e cosa rende spam qualcosa .
Makyen
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.