Désactiver le bouton de retour dans Android


334

Comment désactiver le bouton de retour dans Android lors de la déconnexion de l'application?


1
Pouvez-vous être un peu plus clair sur la question? Si vous cherchez à remplacer le comportement par défaut du bouton Précédent, référez-vous à cette question ici. stackoverflow.com/questions/2000102/…
Gopinath

26
Veuillez ne pas le faire à moins d'avoir une bonne raison, car briser le modèle de fonctionnement attendu nuit très légèrement à toute la plate
Hamy

14
Vous voudriez le faire si vous devez faire face à un stupide Samsung S4 où le bouton arrière est sensible au toucher (pas physique), juste sur le bord du téléphone, qui est déjà si sensible au toucher qu'une paume appuyée contre le côté le fera retourner.
garlicman

1
C'est contre le guide de qualité et de conception Android , rôle UX-N1.
MiguelSlv

Réponses:


651

Remplacez la méthode onBackPressed et ne faites rien si vous vouliez gérer le bouton de retour sur l'appareil.

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

12
C'est beaucoup mieux et plus propre que de remplacer les méthodes de manipulation des clés, et cela a le même effet. Très bonne réponse!
Nik Reiman

2
Grand mec de solution. Est-il possible de faire comme ça avec le bouton d'accueil?
Datta Kunde

1
C'est bien! En fait, je voulais toujours revenir à mon activité principale en appuyant sur toute autre activité, et remplacer cette méthode me permet de le faire très facilement.
Jim

Oups j'ai oublié de supprimer super.onBackPressed ().
Aristo Michael

173

Si vous recherchez un niveau d'api supérieur 2.0 et supérieur, cela fonctionnera très bien

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

Si vous recherchez un niveau d'api android jusqu'à 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);    
}

Écrivez le code ci-dessus dans votre activité pour éviter d'appuyer sur le bouton de retour


5
Cette méthode est plus rétrocompatible que l'utilisation de onbackpressed en raison de l'exigence de niveau api de
onbackpressed

5
Très bonne réponse. Bien que je n'en ai pas besoin pour mon projet, j'apprécie que vous ayez fourni à la fois l'ancienne et la nouvelle méthode. Cela devrait être marqué comme réponse correcte. +1
Jim

1
@Javanator le second ne fonctionnerait pas pour moi (pour le niveau API 16 par exemple), mais le premier fonctionne comme un charme
noloman

38

Vous pouvez le faire de cette manière simple N'appelez pas super.onBackPressed ()

Remarque: - Ne faites cela que si et jusqu'à ce que vous ayez de bonnes raisons de le faire.

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

6
Une explication sur "pourquoi pas" serait formidable. Merci.
presque un débutant

Ne pas appeler .super est important!
Ran

3
@almostabeginner car ne pas appeler super invalidera l'utilisation normale du bouton retour. les utilisateurs paniqueront lorsqu'un bouton qui fonctionne normalement cesse de fonctionner. ils peuvent penser que l'application est boguée ou que le téléphone fonctionne mal, etc. votre application sera finalement le coupable.
bengongon97

23

Substituez simplement la méthode onBackPressed () .

@Override
public void onBackPressed() { }

13

Je l'utilise .............

 @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

Si vous voulez vous assurer que votre application client Android est déconnectée d'un serveur avant que votre activité ne soit tuée -> déconnectez-vous avec un service sur son propre thread (c'est ce que vous êtes censé faire de toute façon).

La désactivation du bouton de retour ne résoudra rien pour vous. Vous aurez toujours le même problème lorsque l'utilisateur reçoit un appel téléphonique par exemple. Lorsqu'un appel téléphonique est reçu, votre activité a à peu près autant de chances de se faire tuer avant de recevoir une réponse fiable du réseau.

C'est pourquoi vous devez laisser un service attendre sur son propre thread la réponse du réseau, puis recommencer s'il échoue. Le service Android est non seulement beaucoup moins susceptible d'être tué avant d'avoir une réponse, mais s'il est vraiment tué avant de terminer le travail, il peut toujours être réactivé par AlarmManager pour réessayer.


8

Remplacez simplement la méthode onBackPressed () et pas besoin d'appeler la super classe de la méthode onBackPressed ou autres.

@Override
public void onBackPressed()
{

}

Ou passez votre activité actuelle dans la méthode onBackPressed ().

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

Remplacez votre nom d'activité requis par myActivity.

si vous utilisez un fragment, appelez tout d'abord la méthode callParentMethod ()

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

puis appelez la méthode vide

@Override
public void onBackPressed()
{

}

6

si vous utilisez FragmentActivity. alors fais comme ça

appelez d'abord ceci à l'intérieur de votre Fragment.

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

puis appelez la onBackPressedméthode à côté de votre FragmentActivityclasse parent .

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

5

Juste en utilisant ce code: Si vous voulez désactiver la contre-pression, vous n'utilisez pas super.OnBackPressed ();

@Override
public void onBackPressed() {

}

4

Si vous souhaitez désactiver votre application pendant la déconnexion, vous pouvez faire apparaître une boîte de dialogue non annulable.


4

Vous pouvez remplacer la onBackPressed()méthode dans votre activité et supprimer l'appel à la super classe.

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

3

Vous avez juste besoin de remplacer la méthode du bouton retour. Vous pouvez laisser la méthode vide si vous le souhaitez afin que rien ne se produise lorsque vous appuyez sur le bouton de retour. Veuillez consulter le code ci-dessous:

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

3

Mis à part ces deux méthodes de la réponse ci-dessus.

onBackPressed () (API niveau 5, Android 2.0)

onKeyDown () (API niveau 1, Android 1.0)

Vous pouvez également remplacer le dispatchKeyEvent()(API niveau 1, Android 1.0) comme ceci,

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

3

Désactiver le bouton arrière dans Android

@Override
public void onBackPressed() {
    return;
}

2

Pour moi, le simple dépassement onBackPressed()n'a pas fonctionné, mais il a été indiqué explicitement quelle activité il devait démarrer fonctionnait bien:

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

1

Essaye ça:

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

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

1

retirer super.onBackPressed()du public void onBackPressed()travail grand. son testé dans android 9

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.