Android onBackPressed() 不被调用?

在我的 MainActivity 中,从 AppCompatActivity 扩展而来,我想覆盖 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;
}
}

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


答案 1

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

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

  1. 由于 logcat 控制台中的筛选器错误,日志不起作用
  2. Toast dosn不起作用,因为传递的上下文错误
  3. 操作系统由供应商错误地实施。

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

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

对于日志,只需在 logcat 上设置正确的筛选器即可。

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

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


答案 2

它是 API < 5 中调用的默认操作,也是从 API 级别 5 及更高版本调用的默认操作。如果不调用 ,则不会调用。onBackPressed()onKeyDown()onKeyUp()onKeyUp()super.onKeyUp()onBackPressed()

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
     */
    return super.onKeyUp(keyCode, event);
}

另外,可能不调用的另一个原因是因为您正在使用操作栏上的软后退按钮,在这种情况下需要以下内容:onBackPressed()

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

推荐