在我的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;
}
}
编辑:我说的是硬件后退按钮(不是动作栏一个)
这个问题已经回答了,但我想在这个主题中明确一些内容。大多数评论和回答指出使用super.onBackPressed()
,这是不工作方法onBackPressed()
的原因。但是让其他初学者知道这是不正确和重要的。方法onBackPressed()
不需要使用super.onBackPressed()
。例如,如果有人评论onBackPressed()
,super.onBackPressed()
also就可以了。
正如提问者写的那样,他不会使用super.onBackPressed()
,因为它会关闭活动。因此,导致其失效的原因可能分为三个可能的原因:
通常,toast通过传递正确的上下文来工作。在提问者的情况下,只需通过this
。
@Override
public void onBackPressed() {
Log.d("MainActivity","onBackPressed");
Toast.makeText(this,"onBackPressed",Toast.LENGTH_SHORT).show();
}
对于Log,只需在logcat上设置正确的过滤器即可。
我不在乎是否有人现在给予了投票,但对其他初学者来说必须清楚,不得使用super.onBackPressed()
。
无论如何,使用onKeyDown()
也是一种解决方案。
onBackPressed()
是一个默认操作,在API <5时从onKeyDown()
调用,默认操作从API级别5及更高版本调用onKeyUp()
。如果onKeyUp()
没有调用super.onKeyUp()
,则不会调用onBackPressed()
。
文档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()
是因为你正在使用操作栏上的软后退按钮,在这种情况下需要以下内容:
@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);
}
}
你错过了,super.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()即可
确保你没有在超级视图中调用onkeydown,因为它首先处理后退按钮。