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


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.


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

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.


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


Dies scheint der einfachste Weg für mich zu sein. Vielen Dank
TuanDPH



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

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

1
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

in onCreatedMethode für die neue apis.


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

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

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);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.