Android - Zurück-Schaltfläche in der Titelleiste

108

In vielen Apps (Kalender, Laufwerk, Play Store) wird das Symbol in der Titelleiste zu einer Zurück-Schaltfläche, wenn Sie auf eine Schaltfläche tippen und eine neue Aktivität eingeben. Bei der von mir erstellten App ist dies jedoch nicht der Fall. Wie kann ich mit diesem Symbol zum vorherigen Bildschirm zurückkehren?

Drew
quelle
Versuchen Sie getSupportActionBar () im OnCreate-Beispiel hier freakyjolly.com/how-to-add-back-arrow-in-android-activity
Code Spy

Antworten:

144

Es gibt zwei einfache Schritte, um eine Zurück-Schaltfläche in der Titelleiste zu erstellen:

Machen Sie zunächst das Anwendungssymbol mit dem folgenden Code in der Aktivität anklickbar, in deren Titelleiste Sie eine Zurück-Schaltfläche haben möchten:

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

Nachdem Sie den obigen Code hinzugefügt haben, wird links neben dem Anwendungssymbol ein Zurückpfeil angezeigt.

Geben Sie hier die Bildbeschreibung ein

Zweitens müssen Sie nach dem oben beschriebenen Vorgang noch Code erstellen, der das Klickereignis nutzt. Beachten Sie dazu, dass beim Klicken auf das Anwendungssymbol eine onOptionsItemSelectedMethode aufgerufen wird. Um zur vorherigen Aktivität zurückzukehren, fügen Sie diese Methode zu Ihrer Aktivität hinzu und fügen Sie IntentCode ein, der Sie zur vorherigen Aktivität zurückführt . Angenommen, die Aktivität, zu der Sie zurückkehren möchten , wird aufgerufen MyActivity. Um darauf zurückzukommen, schreiben Sie die Methode wie folgt:

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

Das ist es!

(In der Android-Entwickler-API wird empfohlen, mit dem Manifest herumzuspielen und Dinge wie hinzuzufügen android:parentActivityName. Aber das scheint für mich nicht zu funktionieren. Das oben Genannte ist einfacher und zuverlässiger.)

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

Und in deiner Aktivität

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Luke F.
quelle
23
Sie haben es gut erklärt, aber wenn es in Ihrem onOptionItemSelected nicht falsch ist, sollten Sie einfach finish () aufrufen. In Ihrem Fall startet startActivityForResult die zweite Aktivität und wenn Sie von der zweiten Aktivität zurück drücken, werden Sie zur ersten Aktivität zurückgeworfen (wo Sie das Aktionsleistensymbol gedrückt haben)
Yahya Arshad
8
Darüber hinaus sollten Sie dies nur tun, wenn item.getItemId () android.R.id.home ist
Bitek
2
Wie AS feststellt: "Der Methodenaufruf 'actionBar.setDisplayHomeAsUpEnabled (true)' kann java.lang.NullPointerException erzeugen"
statosdotcom
1
Warnung! Mit einer ToolBar gibt actionBar bei Absturz null zurück. Siehe Antworten unten.
CoolMind
5
getActionBar () hat bei mir nicht funktioniert, die App stürzt einfach ab. getSupportActionBar () hat funktioniert.
John Ktejik
59

Verwenden Sie diesen Code

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

Danach schreiben Sie diesen Code in onOptionsItemSelectedMethode

  int id = item.getItemId();

     if (id==android.R.id.home) {
        finish();
    }
Anupam Sharma
quelle
1
getActionBar()gibt mir eine Null; weißt du, warum?
Msysmilu
3
weil es keine ActionBar gibt, z. B. mit dem Stil <item name = "android: windowActionBar"> false </ item> <item name = "android: windowNoTitle"> true </ item>
Paul Verest
46

Ich habe es endlich geschafft, die Schaltfläche Zurück zur Aktionsleiste / Symbolleiste richtig hinzuzufügen

@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;
}
Lucy Fair
quelle
3
Dies ist die einzige Antwort, die für mich funktioniert. Vielen Dank, dass Sie @LucyFair
Arda Çebi
2
Gleich. Vielen Dank für Ihre Antwort.
Maria
Gleich. Keine der anderen Antworten funktioniert. Dies hätte die akzeptierte Antwort sein sollen.
El Sushiboi
18

1.- Fügen Sie die Aktivität zu AndroidManifest.xml hinzu und stellen Sie sicher, dass Sie die Metadaten bereitstellen:

<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.- Fügen Sie der onCreate-Methode der Aktivität den folgenden Code hinzu:

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

3.- Überschreiben Sie onOptionsItemSelected und verwenden Sie die statische Methode NavUtils.navigateUpFromSameTask (), um durch den Stapel zu navigieren.

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

Die Verwendung von navigUpFromSameTask () ist jedoch nur geeignet, wenn Ihre App der Eigentümer der aktuellen Aufgabe ist (dh der Benutzer hat diese Aufgabe von Ihrer App aus gestartet). Wenn dies nicht der Fall ist und Ihre Aktivität in einer Aufgabe gestartet wurde, die zu einer anderen App gehört, sollte durch Navigieren nach oben eine neue Aufgabe erstellt werden, die zu Ihrer App gehört. Dazu müssen Sie einen neuen Backstack erstellen.

Spacebiker
quelle
Vielen Dank für die Einführung der NavUtils!
AntonSack
10

Wenn Ihre Aktivität die Aktivität erweitert

public class YourActivity extends Activity {

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

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}

Wenn Ihre Aktion AppCompatActivity erweitert

public class YourActivity extends AppCompatActivity {

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

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

Nichts mehr zu tun Addieren

[OPTIONAL] Um die übergeordnete Aktivität explizit zu definieren, ändern Sie Ihre Manifest.xml wie folgt:

<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>

Siehe Festlegen der übergeordneten Aktivität

Knirps
quelle
1
Genau das habe ich gesucht. Du hast meinen Tag gerettet. Vielen Dank.
Tashi Dendup
6

Wenn sich Ihre Aktivität erweitert AppCompatActivity, müssen Sie die onSupportNavigateUp()Methode wie folgt überschreiben :

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

Behandeln Sie Ihre Logik in Ihrer onBackPressed()Methode und rufen Sie diese Methode einfach auf, onSupportNavigateUp()damit die Zurück-Taste am Telefon und der Pfeil in der Symbolleiste dasselbe tun.

Ruzin
quelle
6

Fügen Sie zunächst in der onCreate-Funktion die folgende Zeile hinzu

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

und fügen Sie dann die folgende Funktion in den Code ein:

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

        return super.onOptionsItemSelected(item);
    }
M Anees
quelle
6

Zuerst müssen Sie diese Codes schreiben

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

Fügen Sie dann diese Zeile im Manifest hinzu

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

Ich denke es wird funktionieren

Shahriar Ahmad
quelle
5

Wenn Sie die neue Support-Bibliothek für 5.1 in Android Studio verwenden, können Sie diese stattdessen in Ihrer AppCompatActivity verwenden

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

Prost.

ralphgabb
quelle
5

Die einfachste Art und Weise und bewährte Verfahren wie Google erklären hier :

1. Fügen Sie einen Elternteil für Ihr Kind hinzu. Aktivität in AndroidManifest.xml:

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

2.Aktivieren Sie die Zurück-Schaltfläche in Ihrer childActivity:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

Hat für mich gearbeitet, ich hoffe es funktioniert auch für dich.

luke8800gts
quelle
Dies ist nur gültig, wenn die Aktivität nur eine übergeordnete Aktivität haben kann. Das ist bei mir der Fall. +1
MQoder
Schritt 2 war in meinem Fall nicht erforderlich.
Thomio
5

Nach einer Zeit, die ich gefunden habe, ist die Themenoption das Hauptproblem in meinem Code. Das Folgende ist der richtige Weg, um die Symbolleiste für mich anzuzeigen

In der AndroidManifest-Datei müssen Sie zuerst Ihren Designstil ändern

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

dann müssen Sie bei Ihrer Aktivitäts-XML Ihre eigene Symbolleiste wie aufrufen

<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"/>

Und dann sollte diese Symbolleiste in Ihrer Java-Datei von aufgerufen werden

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

Und für die Symbolleiste, in der U angezeigt wird, sollte die Null überprüft werden, um eine NullPointerException zu vermeiden

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

Fügen Sie dies für die Heimaktivität wieder hinzu

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

        return super.onOptionsItemSelected(item);
    }

ODER für Ihre gewünschte Aktivität zurück

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

Ich habe so viele komplexe Antworten gesehen, das ist also mein Code. Hier arbeiten. Sie können dies auf zwei Arten erreichen.

1) Stardard Android-Kompatibilität

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) Verwenden Sie ein benutzerdefiniertes Symbol

Wenn Sie Code in Kommentaren verwenden möchten, müssen Sie diese Datei nur in drawable mit dem Namen ic_arrow_white_24dp.xml hinzufügen

<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>

Mit diesem Code.

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

Hoffe es wird einigen Leuten hier helfen!

Zhar
quelle
2

Die ActionBarActivityleichtgewichtige Version ohne Verwendung hat hier immer noch die gleichen Verhaltensweisen:

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

Verwendung: Setzen Sie new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);ein onCreate.

Mein Gott
quelle
Dies passt zum neuen Symbolleisten-Widget, das in der Support-Bibliothek enthalten ist. Vielen Dank!!
Clocker
2

Sie müssen den unten genannten Code in die Manifestdatei einfügen. Suchen Sie nach der Aktivität, in der Sie die Rückpfeilfunktion hinzufügen möchten. Wenn Sie die finden, dann gut oder erstellen Sie die Aktivität

<activity android:name=".SearchActivity">

</activity>

Fügen Sie dann die folgenden drei Codezeilen dazwischen hinzu.

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

Und vergessen Sie nicht, diesen Code in onCreate () einzufügen. Methode Ihrer speziellen Aktivität, bei der Sie einen Zurückpfeil benötigen.

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

So habe ich das Problem gelöst. Vielen Dank.

Muhammad Raqib
quelle
2

In den anderen Antworten wird nicht erwähnt, dass Sie dies auch im XML Ihres ToolbarWidgets festlegen können :

app:navigationIcon="?attr/homeAsUpIndicator"

Beispielsweise:

<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" />
Michael Litvin
quelle
2

Alles, was Sie im Jahr 2020 tun müssen:
(wenn Sie zur MainActivity zurückkehren möchten)

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;
}
Ahmed Abdullah
quelle
Das ist interessant, aber Sie gehen davon aus, dass wir zu MainActivity zurückkehren möchten. Wie würden Sie zu einer früheren Aktivität weiterleiten?
1.
1

Dies kann auch ohne Code erfolgen, indem eine übergeordnete Aktivität im App-Manifest angegeben wird. Wenn Sie in Aktivität B eine Zurück-Schaltfläche möchten, die zu Aktivität A führt, fügen Sie einfach Aktivität A als übergeordnete Aktivität von Aktivität B im Manifest hinzu.

aby4reality
quelle
1

Für Kotlin:

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        onBackPressed();
        return true;
    }
Raluca Lucaci
quelle
1

Ich musste einige Antworten mischen, um die richtige Antwort für mich zu erhalten, da meine App 3 Aktivitäten enthält, die jederzeit ausgeführt werden können. Aktivität1> Aktivität2> Aktivität3. Wenn ich etwas an meiner Aktivität3 getan habe, wurde die Zurück-Schaltfläche korrekt auf Aktivität2 zurückgesetzt. Bei Verwendung von Aktivität2 wurde finish()jedoch auf Aktivität3 und nicht auf Aktivität1 zurückgegriffen. Und ich erweitere AppCompatActivity. Meine Lösung war also:

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

            getSupportActionBar().setHomeButtonEnabled(true);
        }
    }

auf 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>

und schließlich die Aktionsschaltfläche in meinem Menü (Aktionsleiste):

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

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

        }

        return super.onOptionsItemSelected(item);

    }

Verwenden NavUtils.navigateUpFromSameTask(this);hat für mich funktioniert, anstatt finish().

Gi Tavares
quelle
1

Ich teile nur etwas, das mir geholfen hat und für andere nützlich sein kann. Obwohl die meisten Antworten hier richtig sind, hat dies bei Verwendung von getActionBar().setDisplayHomeAsUpEnabled(true);nicht funktioniert. Das Problem, das ich hatte, war, dass ich versucht habe, eine zweite Aktivität manuell zu erstellen, aber es gibt weitere Details.
Was mein Problem wirklich gelöst hat, war das folgende Tutorial für Android-Entwickler ( https://developer.android.com/training/basics/firstapp/starting-activity ) zum Erstellen einer zweiten Aktivität mit Android Studio-eigenen Tools:

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.
ofri cofri
quelle
0

Sie können auch einfach onBackPressed()Ihren onClick-Listener einfügen. Dies bewirkt, dass sich Ihre Schaltfläche wie die Standardschaltflächen "Sichern / Sichern" in Android-Apps verhält!

user3700215
quelle
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);
}
Abhay Agrawal
quelle
0

Dies funktioniert für mich. Angenommen, es gibt zwei Aktivitäten (Activityone, Activitytwo)

Innerhalb von Activitytwo wird dieser Code verwendet

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

Auf Activityone

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

Dies sollte in der zweiten Aktivität in der Manifestdatei enthalten sein

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

Und das Ergebnis wäre so

Geben Sie hier die Bildbeschreibung ein

Muhaiminur Rahman
quelle