Wyłącz przycisk Wstecz w Androidzie


334

Jak wyłączyć przycisk Wstecz w Androidzie podczas wylogowywania aplikacji?


1
Czy możesz być nieco bardziej jasny w kwestii? Jeśli chcesz zastąpić domyślne zachowanie przycisku Wstecz, zapoznaj się z tym pytaniem tutaj. stackoverflow.com/questions/2000102/…
Gopinath

26
Nie rób tego, chyba że masz ku temu dobry powód, ponieważ złamanie oczekiwanego modelu działania bardzo nieznacznie szkodzi całej platformie
Hamy

14
Chciałbyś to zrobić, jeśli masz do czynienia z głupim Samsungiem S4, w którym przycisk Wstecz jest wrażliwy na dotyk (nie fizyczny), tuż przy krawędzi telefonu, który jest już tak wrażliwy na dotyk, że dłoń spoczywająca na boku będzie Wróć.
czosnnik

1
Jest to sprzeczne z przewodnikiem Android Quality and Design , rola UX-N1.
MiguelSlv,

Odpowiedzi:


651

Zastąp metodę onBackPressed i nie rób nic, jeśli chcesz obsłużyć przycisk Wstecz na urządzeniu.

@Override
public void onBackPressed() {
   if (shouldAllowBack()) {
       super.onBackPressed();
   } else {
       doSomething();
   }
}

12
Jest to o wiele lepsze i czystsze niż zastępowanie kluczowych metod obsługi i ma ten sam efekt. Świetna odpowiedź!
Nik Reiman

2
Świetne rozwiązanie koleś. Czy można to zrobić za pomocą przycisku Home?
Datta Kunde

1
To jest świetne! Naprawdę chciałem zawsze powrócić do mojej głównej aktywności, gdy odsuwam się od jakiejkolwiek innej aktywności, a zastąpienie tej metody pozwala mi to zrobić bardzo łatwo.
Jim

Ups, zapomniałem usunąć super.onBackPressed ().
Aristo Michael,

173

Jeśli szukasz wyższego poziomu interfejsu API 2.0 i wyższego, będzie to działać świetnie

@Override
public void onBackPressed() {
    // Do Here what ever you want do on back press;
}

Jeśli szukasz poziomu interfejsu API Androida do 1.6.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
     if (keyCode == KeyEvent.KEYCODE_BACK) {
     //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR
     return true;
     }
     return super.onKeyDown(keyCode, event);    
}

Napisz powyższy kod w swoim działaniu, aby zapobiec naciśnięciu przycisku Wstecz


5
Ta metoda jest bardziej zgodna z poprzednimi wersjami niż używanie onbackppress ze względu na wymagania dotyczące poziomu interfejsu API
onbackpressed

5
Świetna odpowiedź. Chociaż nie potrzebuję tego do mojego projektu, doceniam, że podałeś zarówno stare, jak i nowe metody. To powinno być oznaczone jako poprawna odpowiedź. +1
Jim

1
@Javanator drugi nie działałby dla mnie (na przykład na poziomie API 16), ale pierwszy działa jak urok
noloman

38

Możesz to zrobić w prosty sposób Nie wywołuj super.onBackPressed ()

Uwaga: - Nie rób tego, chyba że masz ku temu silny powód.

@Override
public void onBackPressed() {
// super.onBackPressed();
// Not calling **super**, disables back button in current screen.
}

6
Wyjaśnienie „dlaczego nie” byłoby świetne. Dzięki.
prawie początkujący

Nie dzwonienie na .super jest ważne!
Ran

3
@almostabeginner, ponieważ brak wywołania super spowoduje unieważnienie normalnego użycia przycisku Wstecz. użytkownicy będą wariować, gdy normalnie działający przycisk przestanie działać. mogą myśleć, że aplikacja jest wadliwa lub telefon działa nieprawidłowo itp. Twoja aplikacja będzie w końcu winowajcą.
bengongon97

23

Po prostu zastąp metodę onBackPressed () .

@Override
public void onBackPressed() { }

13

Używam tego.............

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK)
        Toast.makeText(getApplicationContext(), "back press",      
     Toast.LENGTH_LONG).show();

    return false;
       // Disable back button..............
}

9

Jeśli chcesz się upewnić, że aplikacja kliencka na Androida jest wylogowana z jakiegoś serwera, zanim Twoja aktywność zostanie zabita -> wyloguj się z usługą w swoim wątku (to i tak powinieneś zrobić).

Wyłączenie przycisku Wstecz nie rozwiąże problemu. Nadal będziesz mieć ten sam problem, na przykład gdy użytkownik odbierze połączenie telefoniczne. Po odebraniu połączenia telefonicznego Twoja aktywność ma prawie taką samą szansę na zabicie, zanim otrzyma wiarygodną odpowiedź z sieci.

Dlatego należy pozwolić usłudze poczekać na swój wątek na odpowiedź z sieci, a następnie spróbować ponownie, jeśli się nie powiedzie. Usługa Androida nie tylko jest znacznie mniej podatna na śmierć, zanim otrzyma odpowiedź, ale jeśli naprawdę zostanie zabita przed zakończeniem pracy, zawsze może zostać przywrócona przez AlarmManager, aby spróbować ponownie.


8

Wystarczy zastąpić metodę onBackPressed () i nie trzeba wywoływać superklasy metody onBackPressed ani innych.

@Override
public void onBackPressed()
{

}

Lub przekaż swoją bieżącą aktywność do metody onBackPressed ().

@Override
public void onBackPressed()
{
   startActivity(new Intent(this, myActivity.class));  
   finish();
}

Zastąp wymaganą nazwę działania myActivity.

jeśli używasz fragmentu, najpierw wywołaj metodę callParentMethod ()

public void callParentMethod(){
    context.onBackPressed(); // instead of context use getActivity or something related
}

następnie wywołaj pustą metodę

@Override
public void onBackPressed()
{

}

6

jeśli używasz FragmentActivity. to zrób tak

pierwsze połączenie To w twoim Fragment.

public void callParentMethod(){
    getActivity().onBackPressed();
}

a następnie wywołaj onBackPressedmetodę obok swojej FragmentActivityklasy nadrzędnej .

@Override
public void onBackPressed() {
  //super.onBackPressed();
  //create a dialog to ask yes no question whether or not the user wants to exit
  ...
}

5

Wystarczy użyć tego kodu: jeśli chcesz wyłączyć backpressed, nie używasz super.OnBackPressed ();

@Override
public void onBackPressed() {

}

4

Jeśli chcesz wyłączyć aplikację podczas wylogowywania, możesz wyświetlić okno dialogowe, którego nie można anulować.


4

Możesz zastąpić onBackPressed()metodę w swojej działalności i usunąć połączenie z superklasą.

@Override
public void onBackPressed() {
  //remove call to the super class
  //super.onBackPressed();
}

3

Wystarczy zastąpić metodę przycisku Wstecz. Możesz pozostawić pustą metodę, jeśli chcesz, aby nic się nie stało po naciśnięciu przycisku Wstecz. Proszę spojrzeć na poniższy kod:

@Override
public void onBackPressed() 
{
   // Your Code Here. Leave empty if you want nothing to happen on back press.
}

3

Oprócz tych dwóch metod z powyższej odpowiedzi.

onBackPressed () (API Level 5, Android 2.0)

onKeyDown () (API Level 1, Android 1.0)

Możesz również zastąpić dispatchKeyEvent()(API Level 1, Android 1.0) w ten sposób,

dispatchKeyEvent() (API Level 1, Android 1.0)

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    // TODO Auto-generated method stub
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
        return true;
    }
    return super.dispatchKeyEvent(event);
}


2

Dla mnie po prostu przesłonięcie onBackPressed()nie działało, ale wyraźne wskazanie, które działanie powinno rozpocząć, działało dobrze:

@Override
public void onBackPressed(){
  Intent intent = new Intent(this, ActivityYouWanToGoBack.class);
  startActivity(intent);
}

1

Spróbuj tego:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
 if (keyCode == KeyEvent.KEYCODE_BACK) {

   return true;
 }
   return super.onKeyDown(keyCode, event);    
}

1

świetnie usuwaj super.onBackPressed()z public void onBackPressed()pracy. przetestowany w systemie Android 9

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.