Android onBackPressed () не вызывается?

в моей MainActivity, которая простирается от AppCompatActivity, я хочу переопределить метод onBackPressed следующим образом:

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

но onBackPressed не вызывается. Как бы то ни было, если я не переопределяю onBackPressed, приложение закрывается, когда я нажимаю кнопку backbutton, и если я переопределяю его, это не так.

остальная часть моей деятельности выглядит так:

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: я говорю об аппаратной кнопке backbutton (а не actionbar)

5 ответов


этот вопрос уже ответили, но я чувствую, чтобы очистить что-то здесь в этой теме. Большинство комментариев и ответов указывают на использование super.onBackPressed() и что это является причиной не работает метод onBackPressed(). Но это не правильно и важно, чтобы другие новички знают. Метод onBackPressed() не нужно использовать super.onBackPressed() . onBackPressed()также работает, если кто-то, например, комментарий super.onBackPressed() выход.

как написал вопрошающий, он не будет использовать super.onBackPressed() потому что он закроет деятельность. Итак, причина этого, почему он не работает, может быть разделена на три возможные причины:

  1. журнал не работает из-за плохого фильтра в консоли logcat
  2. тост dosnt работает из-за неправильного переданного контекста
  3. ОС реализована неправильно поставщиком.

обычно тост работает, передавая правильный контекст. В случае с вопрошающим, просто проходя this .

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

для журнала просто установите правильный фильтр на logcat.

мне все равно, если кто-то дает downvotes сейчас, но для других новичков должно быть ясно, что super.onBackPressed() не должны использоваться.

в любом случае, использование onKeyDown() также является решением.


на onBackPressed() действие по умолчанию вызывается из onKeyDown() в API onKeyUp() от уровня API 5 и выше. Если onKeyUp() не называет super.onKeyUp(), onBackPressed() не будет называться.

документация onKeyDown ()

документация 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);
}

еще одна причина, что onBackPressed() может не вызываться, потому что вы используете мягкую кнопку назад на actionbar, в этом случае необходимо следующее:

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

ты пропал,супер.onBackPressed();

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

или вы можете использовать

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

спасибо


просто удалите super.onBackPressed() он будет работать


использовать super.onBackPressed()

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