Wyświetl przycisk powrotu na pasku akcji


181

Staram się wyświetlał Back buttonna Action barprzenieść poprzednia strona / aktywność lub na stronie głównej (pierwszy otwór). I nie mogę tego zrobić.

mój kod.

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

kod jest w onCreate.


19
Użyj: getSupportActionBar (). SetDisplayHomeAsUpEnabled (true);
Sukitha Udugamasooriya

@SukithaUdugamasooriya Dziękuję bardzo
Sardorbek Rkh

Odpowiedzi:


207

cóż, to jest prosty, aby wyświetlić przycisk Wstecz

actionBar.setDisplayHomeAsUpEnabled(true);

a następnie możesz dostosować zdarzenie wsteczne w onOptionsItemSelected

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

dodałem powyższe wiersze w polu onOptionsItemSelected (element MenuItem), ponieważ mam już menu z działaniem źle wymieniam identyfikatory w celu przekierowania opcji menu, identyfikator domowy nie działa po kliknięciu

Jeśli doświadczasz dziwnego zachowania (jak w: używasz przycisku Wstecz (strona główna) fragmentu i kończysz działanie), upewnij się, że NIE masz ustawionego „android: noHistory” dla tej aktywności, ponieważ jeśli tak, nawet powrót od fragmentu do „przeglądu” działania zakończy go.
Igor

2
Upewnij się, że ustawiłeś aktywność nadrzędną w AndroidMenifest.xml, aby działał przycisk R.id.home.
Leap Hawk

192

Myślę onSupportNavigateUp() to najlepszy i najłatwiejszy sposób, aby to zrobić, sprawdź poniższe kroki. Krok 1 jest konieczny, krok drugi ma alternatywę.

Krok 1 pokazuje przycisk Wstecz: Dodaj tę linięonCreate() metodzie, aby wyświetlić przycisk Wstecz.

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

Krok 2 wdrożenie kliknięcia wstecz: Zastąp tę metodę

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

to już koniec
LUB Krok 2 Alternatywa: Możesz dodać meta do działania w pliku manifestu jako

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

Edycja: jeśli nie korzystasz z AppCompatdziałania, nie używajsupport słowa, możesz użyć

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

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

Dzięki @atariguy za komentarz.


2
To rozwiązanie działa świetnie, gdy trzeba wysłać dane z powrotem do działania nadrzędnego lub jeśli chcesz zachować wartości EditText w działaniu nadrzędnym. Próbowałem onOptionsItemSelectedrozwiązań, ale tego nie zrobiłem.
weeix

3
Najlepsze rozwiązanie +10.
Satheeshwaran

3
Jeśli nie korzystasz z biblioteki obsługi paska akcji, zmodyfikuj w następujący sposób: getActionBar().setDisplayHomeAsUpEnabled(true); @Override public boolean onNavigateUp(){ finish(); return true; }
atariguy

1
Fenomenalny. +1. Prosty. Elegancki. Piękny. :)
Rohit Kumar,

1
Dzięki za pomoc. Korzystając z manifestu, nie działał, ale działał kod
santosh devnath 18.09.18

70

Magia dzieje się w 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
W moim przypadku chcę dodać przycisk Wstecz na tej stronie, na której nie będzie zdarzenia onOptionsItemSelected (pozycja MenuItem) ... Czy istnieje inne rozwiązanie tego problemu?
Vidhi

1
getActionBar().setDisplayHomeAsUpEnabled(true);Najpierw dodaj przycisk
onCreateMethod

1
Myślę, że jeśli zrobisz to w ten sposób, nie cofniesz się, nawet jeśli ponownie zaczniesz poprzednią aktywność, mając teraz jedną instancję więcej i będziesz iść do przodu i do przodu, aż nastąpi przepełnienie stosu, jeśli będziesz kontynuować wystarczająco długo. Myślę, że odpowiedź Igora jest prawidłowa, powinieneś zatrzymać tę aktywność za pomocą kończenia () i pozwolić ramie wrócić do poprzedniej instancji działania.
Reijo Korhonen,

2
użyj this.onBackPressed();metody, gdy użytkownik kliknie przycisk Wstecz.
CaptRisky,

47

Oficjalne rozwiązanie

Dodaj te dwa fragmenty kodu do SubActivity

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

dodaj metadane i parentActivity do manifestu, aby obsługiwać niższe sdk.

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

Odnośnik tutaj: http://developer.android.com/training/implementing-navigation/ancestral.html


5
Uwaga: jeśli używasz bibliotek wsparcia dla kompatybilności wstecznej, będziesz musiał użyć „getSupportActionBar ()” zamiast „getActionBar ()”. To najbardziej kompletna i oficjalna odpowiedź.
Christopher Bull

32

Dodaj te linie do onCreate ()

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

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

Mam nadzieję, że to ci pomoże ...!


27

Wypróbuj ten kod, uważa go tylko, jeśli potrzebujesz przycisku Wstecz.

@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

W onCreatemetodzie dodaj:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Podczas definiowania w działaniu AndroidManifest.xmlnadrzędnym (działanie, które zostanie wywołane po naciśnięciu przycisku Wstecz na pasku działań):

W swojej <activity>definicji manifestu dodaj wiersz:

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

Musisz tylko wstawić kod manifestu, jeśli chcesz obsługiwać urządzenia starsze niż 4.0. Pierwszy bit kodu jest jednak lepszym rozwiązaniem dla obecnych bibliotek.
Louie Bertoncin

8

Wiem, że jestem trochę spóźniony, ale udało mi się rozwiązać ten problem, wykonując bezpośrednio dokumenty .

Dodaj znacznik metadanych do AndroidManifest.xml(aby system wiedział)

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

Następnie włącz przycisk Wstecz (góra) w swoim 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);
    } 

I wszystko będzie gotowe!

Źródło: Dokumentacja programisty Androida


6

Wiem, że powyższe są wieloma przydatnymi rozwiązaniami, ale tym razem przeczytałem ten artykuł (obecny Android Studio 2.1.2 z sdk 23). Niektóre powyższe metody nie działają.

Poniżej moje rozwiązanie dla poddziałania to MapsActivity

Najpierw musisz dodać ParentActivity do

AndroidManifest.xml

lubię to :

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

Po drugie, upewnij się, że Twoja poddziałanie się rozszerza AppCompatActivity, a nie FragmentActivity.

Po trzecie, onOptionsItemSelected()metoda przesłonięcia

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

Mam nadzieję, że to pomoże!


4

Spróbuj tego, w swoim onCreate ()

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

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

Aby to osiągnąć, są po prostu dwa kroki,

Krok 1: Przejdź do AndroidManifest.xmltego parametru i dodaj go do <activity>tagu -android:parentActivityName=".home.HomeActivity"

Przykład:

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

Krok 2: ActivityDetailDodaj swoją actionpoprzednią stronę / aktywność

Przykład:

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

4

w metodzie onCreate pisać

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

a to jest plik 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">

i w styles.xml zmień to na

Theme.AppCompat.Light.NoActionBar

to wszystko, co musimy zrobić.


4

To jest proste i działa dla mnie bardzo dobrze

dodaj to wewnątrz metody onCreate ()

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

dodaj tę zewnętrzną metodę oncreate ()

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

3

W swojej onCreate()metodzie dodaj ten wiersz

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

i w tej samej działalności dodaj tę metodę, aby obsłużyć kliknięcie przycisku

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

2

Rozwiązałem w ten sposób

@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

mój działający kod, aby wrócić do ekranu.

@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

Na odpowiedź może być za późno, ale moim zdaniem mam krótsze i bardziej funkcjonalne rozwiązanie.

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

W trybie oncreate (); napisz ten wiersz->

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

następnie zaimplementuj poniżej metodę w tej klasie

@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

Aby wyświetlić przycisk powrotu paska akcji w Kotlinie można go zaimplementować na 2 sposoby

1. Korzystanie z domyślnego paska akcji udostępnianego przez system Android - Twoja aktywność musi korzystać z motywu zawierającego pasek akcji - np .: 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. Zaprojektuj własny pasek akcji - wyłącz domyślny pasek akcji - np .: Theme.AppCompat.Light.NoActionBar - dodaj układ do pliku 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))
 }
  • stwórz swój własny przycisk
<?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>
  • w 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

Dodaj poniższy kod w funkcji onCreate:

getSupportActionBar (). setDisplayHomeAsUpEnabled (true);

A następnie zastąp: @Override public boolean onOptionsItemSelected (element MenuItem) {onBackPressed (); zwróć prawdę; }


0

W zaktualizowanej wersji getActionBar () nie działa!

Zamiast tego możesz to zrobić w ten sposób

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

dodaj przycisk Wstecz na pasku tytułu Androida, co pomoże Ci w 2020 roku


Ostatnie dwie odpowiedzi prowadzą do tej samej strony. Czy jesteś w jakikolwiek sposób powiązany z tą witryną? Jeśli jesteś powiązany, musisz ujawnić to powiązanie w poście . Jeśli nie ujawnisz powiązania, zostanie to uznane za spam. Zobacz: Co oznacza „dobra” autopromocja? , Kilka wskazówek i porad na temat autopromocji , Jaka jest dokładna definicja „spam” na przepełnienie stosu? i Co powoduje, że coś jest spamem .
Makyen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.