Wie überschreibe ich die Zurück-Schaltfläche der Aktionsleiste in Android?

94

Ich möchte die Schaltfläche "Aktivität zurück" in der Aktionsleiste anpassen, nicht in der Schaltfläche "Zurück". Ich habe die onBackPressed()Methode überschrieben . Es funktioniert mit meiner Emulator-Zurück-Taste, aber nicht mit der Aktionsleiste-Zurück-Taste.

Ich möchte, dass es mit der Aktionsleiste passiert. Wie kann ich das machen?

Hier ist mein Code:

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

Ich habe diesen Toast verwendet, unabhängig davon, ob das Zurückdrücken funktioniert oder nicht, aber die tatsächliche Implementierung ändert sich gerne, um zur vorherigen Aktivität zurückzukehren. Dies funktioniert jedoch nicht mit der Schaltfläche oben in der Aktionsleiste (außer dem Titel der Aktivität).

Bitte jemand könnte mir das Problem nennen.

GK
quelle

Antworten:

209

Ich denke, Sie möchten den Klickvorgang der Home-Schaltfläche überschreiben. Sie können diese Funktionalität in Ihrer Aktivität wie folgt überschreiben.

@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;
}
ibrahimyilmaz
quelle
1
Noah Ibrahim, Eigentlich gibt es in der oberen linken Ecke die Schaltfläche Zurück wie die Schaltfläche Zurück im Browser. Wenn ich auf diese Schaltfläche klicke, möchte ich zur vorherigen Aktivität zurückkehren. Nicht wie der Code, den du oben gepostet hast.
GK
4
add super.onBackPressed (); dazu
redestructa
2
Dieser arbeitete für mich , nachdem ich geändert return true;zu return super.onOptionsItemSelected(item). Dann können Sie etwas bewirken, wenn der Benutzer auf die Schaltfläche zum Zurücksetzen der Aktionsleiste klickt, aber dennoch die gleiche Funktionalität der Schaltfläche beibehält.
Kumaheiyama
Durch diese Technik reagiert die Zurück-Pfeil-Taste zu spät. Das heißt, ich muss eine Sekunde warten, bis das Ereignis ausgelöst wird. Auch der Selektor auf dieser Taste erscheint nicht für den Effekt, während Sie ihn drücken
Gopal Singh Sirvi
Hat bei mir nicht funktioniert. Beim Debuggen habe ich festgestellt, dass die IDs der Home-Schaltfläche und die ID der Schaltfläche unterschiedlich geklickt haben.
Viper
45

Wenn Sie möchten, dass sich die ActionBar-Zurück-Schaltfläche genauso verhält wie die Hardware-Zurück-Schaltfläche:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home) {
                    onBackPressed();
                    return true;
            }
            return false;
    }
ruX
quelle
1
Fall android.R.id.homefeuert nicht
Trancer
2
@Trancer Wenn Sie es in Fragment verwenden, sollten Sie zusätzlich setHasOptionsMenu(true)die onCreate-Methode des Fragments aufrufen
wilddev
10

Zwei Dinge, die zu beachten sind, dass der Benutzer entweder die Zurück-Taste oder die Home-Taste der Aktionsleiste drücken kann.
Wenn Sie ihn also zum selben Ziel umleiten möchten, können Sie dies tun.

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

Dies bringt den Benutzer zu der Absicht, entweder eine Taste oder die Aktionsleistentaste zu drücken.

ssi-anik
quelle
Fall android.R.id.homefeuert nicht
Trancer
@Trancer, es ist fast 1,5+ Jahre her. Und ich mache jetzt kein Android. Ich kann dir jetzt nicht helfen. Es tut uns leid.
ssi-anik
Also, was ist die Lösung?
GA1
7
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case android.R.id.home:
                       finish();
                   break;
                }
                return true;
        }
Krunal Shah
quelle
2
Sie hätten es als Kommentar hinzufügen können. Es ist mehr oder weniger dasselbe wie die akzeptierte Antwort.
Sufian
7

Tut mir leid, meine Antwort ist spät, aber für alle anderen, die mit derselben Frage auf diese Seite kommen, habe ich Folgendes versucht:

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

Dies konnte jedoch den Tastendruck "Zurück" nicht erfassen.

Schließlich fand ich unter https://stackoverflow.com/a/37185334/3697478 eine Methode, die für mich funktioniert, nämlich das Überschreiben von "onSupportNavigateUp ()", wenn ich die Aktionsleiste aus der Support-Bibliothek "AppCompatActivity" verwende. (Für die neuere Aktionsleisten- / Symbolleistenbibliothek gibt es ein äquivalentes "onNavigateUp ()".)

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

und ich habe den Abschnitt "android: parentActivityName =". MainActivity "aus der Manifestdatei entfernt.

Stephen Bridgett
quelle
4

Ich habe dies erreicht, indem ich einfach zwei Schritte verwendet habe:

Schritt 1: Gehen Sie zu AndroidManifest.xml und fügen Sie den Parameter in tag - android hinzu: parentActivityName = ". Home.HomeActivity"

Beispiel:

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

Schritt 2: Fügen Sie in ActivityDetail Ihre Aktion für die vorherige Seite / Aktivität hinzu

Beispiel:

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

Wenn Sie durch Drücken der ActionBar-Home-Schaltfläche zur vorherigen Instanz einer Aktivität zurückkehren möchten, ohne sie neu zu erstellen, können Sie die Methode getParentActivityIntent überschreiben, um die Methode aus dem Backstack zu verwenden:

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

BEARBEITEN:
Sie können das gleiche Ergebnis erzielen,
indem Sie den Startmodus Ihrer übergeordneten Aktivität auf singleTop setzen.
Stellen Sie also android:launchMode="singleTop"in Ihrem Manifest die übergeordnete Aktivität ein.
Oder Sie können das Flag FLAG_ACTIVITY_CLEAR_TOP mit der Absicht UP verwenden.
Referenz: Bereitstellen der Navigation

Leo Droidcoder
quelle
2

(1) Fügen Sie eine Elternaktivität für Ihre Kinderaktivität hinzu (AndroidManifest.xml).

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

(2) Überschreiben Sie die onSupportNavigateUp-Methode innerhalb der untergeordneten Aktivität

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return false;
}
Hariharan Kanakaraja
quelle
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();
}
Roshaan Qurban
quelle
0

Es gibt verschiedene Möglichkeiten, die Schaltfläche "Zurück" in der Leiste einzurichten:

1) Methode .setDisplayHomeAsUpEnabled(true);wird es tun, und dann können Sie einfach überschreibenandroid.R.id.home

2) Hinzufügen <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />in Android Manifest, aber in diesem Fall können Sie OnOptionsMenuSelected nicht überschreiben android.R.id.home.

.. für diejenigen, die sich fragen, warum es bei ihnen nicht funktioniert ...

Jiří
quelle