jak zastąpić przycisk Wstecz paska akcji w systemie Android?

95

Chcę dostosować przycisk Wstecz aktywności na pasku akcji, a nie na twardym przycisku Wstecz. ZastąpiłemonBackPressed()Metoda . Działa z przyciskiem Wstecz mojego emulatora, ale nie z przyciskiem Wstecz na pasku akcji.

Chcę, żeby stało się to z paskiem akcji. Jak mogę to zrobić?

Oto mój kod:

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

Użyłem tego toastu, niezależnie od tego, czy naciśnięcie przycisku wstecz działa, czy nie, ale rzeczywiste zmiany implementacji, takie jak powrót do poprzedniej czynności. Ale to nie działa z przyciskiem znajdującym się na górze paska akcji (poza tytułem działania).

Proszę, każdy mógłby określić mi problem.

GK
źródło

Odpowiedzi:

211

Myślę, że chcesz zastąpić kliknięcie przycisku głównego. Możesz zastąpić tę funkcję w swoim działaniu.

@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
źródło
1
Noah Ibrahim, w rzeczywistości jest przycisk Wstecz w lewym górnym rogu, podobnie jak przycisk Wstecz w przeglądarce. Po kliknięciu tego przycisku chcę wrócić do poprzedniej czynności. W przeciwieństwie do kodu u zamieszczonego powyżej.
GK
4
dodaj super.onBackPressed (); do niego
redestructa
2
To zadziałało dla mnie po zmianie return true;na return super.onOptionsItemSelected(item). Następnie możesz sprawić, że coś się stanie, gdy użytkownik kliknie przycisk Wstecz na pasku akcji, ale nadal zachowasz tę samą funkcjonalność przycisku.
kumaheiyama
Dzięki tej technice przycisk strzałki wstecz reaguje późno. Oznacza, że ​​muszę chwilę poczekać, aby zdarzenie zostało uruchomione. Również nie pojawia się selektor na tym przycisku dla efektu podczas naciskania go
Gopal Singh Sirvi
Nie działa dla mnie. Kiedy debugowałem, znalazłem identyfikatory przycisku głównego, a identyfikator klikniętego przycisku jest inny.
viper
46

Jeśli chcesz, aby przycisk Wstecz na pasku ActionBar zachowywał się tak samo jak sprzętowy przycisk Wstecz:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home) {
                    onBackPressed();
                    return true;
            }
            return false;
    }
ruX
źródło
1
sprawa android.R.id.homenie odpala
Trancer
2
@Trancer jeśli używasz go w Fragment, powinieneś dodatkowo wywołać setHasOptionsMenu(true)metodę onCreate fragmentu
wilddev
10

Dwie rzeczy, o których należy pamiętać, że użytkownik może nacisnąć przycisk Wstecz lub nacisnąć przycisk strony głównej paska akcji.
Jeśli więc chcesz przekierować go do tego samego miejsca docelowego, możesz to zrobić.

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

Spowoduje to przejście użytkownika do intencji naciśnięcia klawisza lub przycisku paska akcji.

ssi-anik
źródło
sprawa android.R.id.homenie odpala
Trancer
@Trancer, to już prawie 1,5+ roku. I nie robię teraz androida. Nie mogę ci teraz pomóc. Przepraszam.
ssi-anik
więc jakie jest rozwiązanie?
GA1
7
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case android.R.id.home:
                       finish();
                   break;
                }
                return true;
        }
Krunal Shah
źródło
2
Mogłeś dodać to jako komentarz. To mniej więcej to samo, co zaakceptowana odpowiedź.
Sufian
7

Przepraszam, że moja odpowiedź jest spóźniona, ale dla każdego, kto przyszedł na tę stronę z tym samym pytaniem, wypróbowałem powyższe:

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

ale nie udało się złapać naciśnięcia przycisku „Wstecz”.

W końcu znalazłem metodę, która działała dla mnie na https://stackoverflow.com/a/37185334/3697478, która ma zastąpić „onSupportNavigateUp ()”, gdy używam paska akcji z biblioteki obsługi „AppCompatActivity”. (Istnieje odpowiednik „onNavigateUp ()” dla nowszej biblioteki paska akcji / paska narzędzi).

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

i usunąłem sekcję „android: parentActivityName =”. MainActivity ”z pliku manifestu.

Stephen Bridgett
źródło
4

Osiągnąłem to, wykonując po prostu dwa kroki,

Krok 1: Przejdź do AndroidManifest.xml i dodaj parametr w tagu - android: parentActivityName = ". Home.HomeActivity"

przykład:

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

Krok 2: w ActivityDetail dodaj akcję dla poprzedniej strony / aktywności

przykład:

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

Jeśli chcesz powrócić do poprzedniego wystąpienia działania , naciskając przycisk główny ActionBar, bez jego ponownego tworzenia, możesz zastąpić metodę getParentActivityIntent, aby użyć metody z tylnego stosu:

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

EDYCJA:
Również możesz osiągnąć ten sam rezultat,
ustawiając launchMode swojej aktywności nadrzędnej na singleTop. Ustaw
więc android:launchMode="singleTop"aktywność rodziców w swoim manifeście.
Możesz też użyć flagi FLAG_ACTIVITY_CLEAR_TOP z intencją UP.
odniesienie: Zapewnianie nawigacji

Leo Droidcoder
źródło
2

(1) Dodaj aktywność rodzica dla aktywności dziecka (AndroidManifest.xml)

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

(2) przesłania metodę onSupportNavigateUp w działaniu podrzędnym

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return false;
}
Hariharan Kanakaraja
źródło
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
źródło
0

Istnieje kilka sposobów konfiguracji przycisku Wstecz na pasku:

1) .setDisplayHomeAsUpEnabled(true);zrobi to, a następnie możesz po prostu zastąpićandroid.R.id.home

2) dodanie <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />w Android Manifest, ale w tym przypadku nie można nadpisać android.R.id.homew OnOptionsMenuSelected.

.. dla tych, którzy zastanawiają się, dlaczego to nie działa ...

Jiří
źródło