web-dev-qa-db-fra.com

Android onBackPressed () n'est pas appelé?

dans mon MainActivity, qui s'étend de AppCompatActivity, je veux remplacer la méthode onBackPressed comme ceci:

@Override
public void onBackPressed() {
    Log.d("MainActivity","onBackPressed");
    Toast.makeText(getApplicationContext(),"onBackPressed",Toast.LENGTH_SHORT).show();
}

mais onBackPressed n'est pas appelé. Cependant, si je ne remplace pas onBackPressed, l'application se ferme, lorsque j'appuie sur le bouton de retour et si je le remplace, ce n'est pas le cas.

Le reste de mon activité ressemble à ceci:

public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;
private Drawer drawer;
private FloatingActionButton fab_test;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    fab_test = (FloatingActionButton) findViewById(R.id.fab_test);
    fab_test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(getApplicationContext(),"FAB Test pressed",Toast.LENGTH_SHORT).show();
        }
    });

    buildDrawer();

    getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer,page).commit();
}

@Override
public void onBackPressed() {
    Log.d("MainActivity","onBackPressed");
    Toast.makeText(getApplicationContext(),"onBackPressed",Toast.LENGTH_SHORT).show();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);      
    return true;
}
}

EDIT: je parle du matériel-backbutton (pas celui de la barre d'action)

13
Steve2955

On a déjà répondu à cette question, mais je pense clarifier quelque chose ici dans ce sujet. La plupart des commentaires et réponses indiquent d'utiliser super.onBackPressed() et que cela est la cause de la méthode qui ne fonctionne pas onBackPressed(). Mais ce n'est pas correct et important de le faire savoir aux autres débutants. La méthode onBackPressed() n'a pas besoin d'utiliser super.onBackPressed(). onBackPressed() fonctionne également si quelqu'un, par exemple, commente super.onBackPressed() out.

Comme l'a écrit l'auteur de la question, il n'utilisera pas super.onBackPressed() car cela mettra fin à l'activité. Ainsi, la cause de cette raison pour laquelle cela ne fonctionne pas, pourrait être séparée en trois causes possibles:

  1. Le journal ne fonctionne pas en raison d'un mauvais filtre dans la console logcat
  2. Le Toast ne fonctionne pas à cause du mauvais contexte passé
  3. Le système d'exploitation est mal mis en œuvre par le fournisseur.

Habituellement, le toast fonctionne en passant le bon contexte. Dans le cas du questionneur, il suffit de passer this.

@Override
public void onBackPressed() {
    Log.d("MainActivity","onBackPressed");
    Toast.makeText(this,"onBackPressed",Toast.LENGTH_SHORT).show();
}

Pour le journal, définissez simplement le filtre correct sur logcat.

Peu m'importe si quelqu'un donne des downvotes maintenant, mais il doit être clair pour les autres débutants que super.onBackPressed() ne doit pas être utilisé.

Quoi qu'il en soit, l'utilisation de onKeyDown() est également une solution.

16
Opiatefuchs

onBackPressed() est une action par défaut appelée depuis onKeyDown() dans l'API <5 et une action par défaut appelée depuis onKeyUp() depuis l'API de niveau 5 et plus. Si onKeyUp() n'appelle pas super.onKeyUp(), onBackPressed() ne sera pas appelée.

Documentation onKeyDown ()

Documentation onKeyUp () .

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    /*
     * without call to super onBackPress() will not be called when
     * keyCode == KeyEvent.KEYCODE_BACK
     */
    super.onKeyUp(keyCode, event);
}

Une autre raison pour laquelle onBackPressed() ne peut pas être appelée est que vous utilisez le bouton de retour en arrière de la barre d'actions, dans ce cas, les éléments suivants sont nécessaires:

@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.
    switch (item.getItemId()) {
        case Android.R.id.home:
            onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
10
BitByteDog

Vous manquez, super.onBackPressed ();

@Override
public void onBackPressed() {
    super.onBackPressed();
}

ou vous pouvez utiliser

@Override  
public boolean onKeyDown(int keyCode, KeyEvent event)  
{  
     //replaces the default 'Back' button action  
     if(keyCode==KeyEvent.KEYCODE_BACK)   {  
// something here
            finish();
     }  
     return true;  
 }  

merci

2
Saveen

assurez-vous que vous n'appelez pas onkeydown dans votre super vue car il gère le bouton de retour en cliquant d'abord.

0
Ahmed Esameddeen

Il suffit de supprimer super.onBackPressed () cela fonctionnera

0
vijay