问题

Android onBackPressed()没有被调用?


在从 AppCompatActivity 扩展的 MainActivity 中,我想像这样覆盖 onBackPressed 方法:

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

但 onBackPressed 不会被调用。但是,如果我不覆盖 onBackPressed,应用程序会关闭,当我按下后退按钮时,如果我确实覆盖它,它不会。

我的其余活动如下所示:

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

编辑:我说的是硬件后退按钮(不是操作栏按钮)

推荐答案

这个问题已经回答了,但我觉得在这个话题中要澄清一些东西。大多数评论和答案都指出使用 super.onBackPressed(),这是导致方法 onBackPressed() 不起作用的原因。但让其他初学者知道这是不正确的和重要的。onBackPressed() 方法不需要使用 super.onBackPressed() 。如果有人将 super.onBackPressed() 注释掉,onBackPressed() 也可以使用。

正如提问者所写,他不会使用 super.onBackPressed() 因为它会关闭活动。因此,导致它无法正常工作的原因可以分为三个可能的原因:

  1. 由于 logcat 控制台中的过滤器错误,日志无法工作
  2. 由于传递的上下文错误,Toast 无法工作
  3. 操作系统的实现错误供应商。

通常,toast 通过传递正确的上下文来工作。在提问者的情况下,只需传递 this

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

对于日志,只需在 logcat 上设置正确的过滤器。

我不在乎现在是否有人投反对票,但其他初学者必须清楚,不能使用 super.onBackPressed()

无论如何,使用 onKeyDown() 也是一种解决方案。