Wie implementiere ich die Android ActionBar Zurück-Schaltfläche?

137

Ich habe eine Aktivität mit einer Listenansicht. Wenn der Benutzer auf das Element klickt, wird das Element "Viewer" geöffnet:

List1.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

        Intent nextScreen = new Intent(context,ServicesViewActivity.class);
        String[] Service = (String[])List1.getItemAtPosition(arg2);

        //Sending data to another Activity
        nextScreen.putExtra("data", datainfo);
        startActivityForResult(nextScreen,0);
        overridePendingTransition(R.anim.right_enter, R.anim.left_exit);
    }
});

Dies funktioniert einwandfrei, aber in der Aktionsleiste wird der Zurückpfeil neben dem App-Symbol nicht aktiviert. Vermisse ich etwas

Joaolvcm
quelle
64
getActionBar().setDisplayHomeAsUpEnabled(true);in onCreate und switch (item.getItemId()) {case android.R.id.home: onBackPressed();break;}in onOptionsItemSelected? beide in ServicesViewActivity
Selvin
7
Warum nicht als Antwortregal?
Karl Karlsom

Antworten:

263

Selvin hat bereits die richtige Antwort gepostet. Hier die Lösung in hübschem Code:

public class ServicesViewActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // etc...
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

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

Für diese Funktion NavUtils.navigateUpFromSameTask(this)müssen Sie die übergeordnete Aktivität in der Datei AndroidManifest.xml definieren

<activity android:name="com.example.ServicesViewActivity" >
    <meta-data
     android:name="android.support.PARENT_ACTIVITY"
     android:value="com.example.ParentActivity" />
</activity>

Sehen Sie hier für weitere Lektüre.

Surffan
quelle
1
In meiner Situation suchte ich nach einer Möglichkeit, onCreate des Elternteils bei der Rückkehr nicht aufzurufen. Zu diesem Zweck habe ich Ihre Implementierung verwendet, aber statt NavUtils.navigateUpFromSameTask (this) finish () aufgerufen. finish () ruft meinen onStart anstelle von onCreate auf, was für mich idealer war.
Jon
Das Festlegen von Metadaten im Manifest ist ein Schlüssel, damit die Navigationsschaltfläche funktioniert
VSB
Verwenden getActionBar().setDisplayHomeAsUpEnabled(true);Sie, falls Sie Support-Bibliotheken verwenden.
Abhinav Upadhyay
Wie ändert man die Richtung des "Wischens"? Standardmäßig wird bei der Implementierung dieser Rückennavigation der Bildschirm von rechts nach links verschoben, und es sieht so aus, als würde ein neuer Bildschirm geladen. Ich möchte jedoch, dass es von links nach rechts gelöscht wird, genau wie das Drücken der eigenen Zurück-Taste des Geräts.
stingray_
Ich habe den Fehler erhalten: Auslöser: java.lang.NullPointerException: Versuch, die virtuelle Methode 'void android.app.ActionBar.setDisplayHomeAsUpEnabled (boolean)' für eine Nullobjektreferenz aufzurufen
Jones
165

Stellen Sie sicher, dass die ActionBar-Home-Schaltfläche in der Aktivität aktiviert ist:

Android, API 5+:

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

ActionBarSherlock und App-Compat, API 7+:

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

Android, API 11+:

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

Beispiel MainActivity, das erweitert ActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home: 
            // API 5+ solution
            onBackPressed();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

Auf diese Weise können alle gewünschten Aktivitäten die Backpress haben.

Android, API 16+:

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

AndroidManifest.xml::

<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.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- The meta-data element is needed for versions lower than 4.1 -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

Beispiel MainActivity, das erweitert ActionBarActivity:

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().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);
    }
}
Jared Burrows
quelle
Es funktioniert für mich, wenn ich getSupportActionBar () ändere. SetDisplayHomeAsUpEnabled (true); in to getActionBar (). setDisplayHomeAsUpEnabled (true); und fügte diese @SuppressLint ("NewApi") bei der onCreate-Methode innerhalb und außerhalb von REF hinzu: => developer.android.com/training/implementing-navigation/…
gnganpath
1
@ganpath Vorsicht, die Verwendung von getActionBar gilt für API 11+ .
Jared Burrows
17

Um die Schaltfläche "ActionBar zurück" zu aktivieren, benötigen Sie offensichtlich eine ActionBar in Ihrer Aktivität. Dies wird durch das von Ihnen verwendete Thema festgelegt. Sie können das Thema für Ihre Aktivität in der AndroidManfiest.xml. Wenn Sie zB das @android:style/Theme.NoTitleBarThema verwenden, haben Sie keine ActionBar. In diesem Fall gibt der Aufruf von getActionBar()null zurück. Stellen Sie also sicher, dass Sie zuerst eine ActionBar haben.

Der nächste Schritt besteht darin android:parentActivityName, die Aktivität festzulegen, zu der Sie navigieren möchten, wenn Sie die Zurück-Taste drücken. Dies sollte auch in der gemacht AndroidManifest.xmlwerden.

Jetzt können Sie die Zurück-Schaltfläche in der onCreateMethode Ihrer "untergeordneten" Aktivität aktivieren .

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

Jetzt sollten Sie die Logik für die Zurück-Schaltfläche implementieren. Sie überschreiben einfach die onOptionsItemSelectedMethode in Ihrer "untergeordneten" Aktivität und überprüfen die ID der Schaltfläche "Zurück" android.R.id.home.

Jetzt können Sie die Methode NavUtils.navigateUpFromSameTask(this); auslösen , ABER wenn Sie die android:parentActivityNamein Ihnen nicht angegeben haben, AndroidManifest.xmlstürzt Ihre App ab.

Manchmal ist es das, was Sie wollen, weil es Sie daran erinnert, dass Sie "etwas" vergessen haben. Wenn Sie dies verhindern möchten, können Sie mithilfe der getParentActivityIntent()Methode überprüfen, ob Ihre Aktivität übergeordnete Elemente hat. Wenn dies null zurückgibt, haben Sie das übergeordnete Element nicht angegeben.

In diesem Fall können Sie die onBackPressed()Methode auslösen, die im Grunde das Gleiche bewirkt, als würde der Benutzer die Zurück-Taste am Gerät drücken. Eine gute Implementierung, die Ihre App niemals zum Absturz bringt, wäre:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            if (getParentActivityIntent() == null) {
                Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!");
                onBackPressed();
            } else {
                NavUtils.navigateUpFromSameTask(this);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Bitte beachten Sie, dass die Animation, die der Benutzer sieht, zwischen NavUtils.navigateUpFromSameTask(this);und unterschiedlich ist onBackPressed().

Es liegt an Ihnen, welchen Weg Sie einschlagen, aber ich fand die Lösung hilfreich, insbesondere wenn Sie für alle Ihre Aktivitäten eine Basisklasse verwenden.

dknaack
quelle
10

AndroidManifest-Datei:

    <activity android:name=".activity.DetailsActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="br.com.halyson.materialdesign.activity.HomeActivity" />
    </activity>

Details hinzufügenAktivität:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

es ist Arbeit :]

Sågär Śåxëńá
quelle
Dies scheint der einfachste Weg für mich zu sein. Vielen Dank
TuanDPH
4

Ich denke, das onSupportNavigateUp()ist der einfachste und beste Weg, dies zu tun

Überprüfen Sie den Code in diesem Link. Klicken Sie hier, um den vollständigen Code anzuzeigen

Inzimam Tariq IT
quelle
1
Toll! Funktioniert bei mir. Vielen Dank!
Morja
3

https://stackoverflow.com/a/46903870/4489222

Um dies zu erreichen, gibt es einfach zwei Schritte:

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
3

Fügen Sie in der OnCreate-Methode Folgendes hinzu:

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

Fügen Sie dann diese Methode hinzu:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
Marco Concas
quelle
1
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

in onCreatedMethode für die neue apis.

Kartik Garasia
quelle
1

Wenn Sie die Symbolleiste verwenden, hatte ich das gleiche Problem. Ich habe es gelöst, indem ich diesen beiden Schritten gefolgt bin

  1. In der AndroidManifest.xml
<activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
  1. Fügen Sie in der SecondActivity diese ...
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
user2823506
quelle
0

Die folgenden Schritte reichen aus, um die Schaltfläche zurück zu drücken:

Schritt 1: Dieser Code sollte sich in Manifest.xml befinden

<activity android:name=".activity.ChildActivity"
        android:parentActivityName=".activity.ParentActivity"
        android:screenOrientation="portrait">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".activity.ParentActivity" /></activity>

Schritt 2: Sie werden nicht geben

finish();

in Ihrer Elternaktivität beim Starten der Kinderaktivität.

Schritt 3: Wenn Sie von der untergeordneten Aktivität zur übergeordneten Aktivität zurückkehren müssen, geben Sie einfach diesen Code für die untergeordnete Aktivität an.

startActivity(new Intent(ParentActivity.this, ChildActivity.class));
Kumar VL
quelle
0

Aufbauend auf Jareds Antwort musste ich das Verhalten der Zurückschaltfläche der Aktionsleiste in mehreren Aktivitäten aktivieren und implementieren und diese Hilfsklasse erstellen, um die Codeduplizierung zu reduzieren.

public final class ActionBarHelper {
    public static void enableBackButton(AppCompatActivity context) {
        if(context == null) return;

        ActionBar actionBar = context.getSupportActionBar();
        if (actionBar == null) return;

        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

Verwendung in einer Aktivität:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...

    ActionBarHelper.enableBackButton(this);
}
Datchung
quelle