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.

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

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

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.


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

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.


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

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


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

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

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

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.