在我的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;
}
}
编辑:我正在谈论硬件后门(而不是动作栏)
答案 0 :(得分:16)
这个问题已经回答了,但我想在这个主题中澄清一些问题。大多数评论和回答都指出使用super.onBackPressed()
,这是无效方法onBackPressed()
的原因。但是让其他初学者知道这是不正确和重要的。方法onBackPressed()
不需要使用super.onBackPressed()
。如果有人评论onBackPressed()
,super.onBackPressed()
也有效。
正如提问者写的那样,他不会使用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()
也是一种解决方案。
答案 1 :(得分:8)
onBackPressed()
是在API< onKeyDown()
中调用的默认操作。 5和来自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);
}
}
答案 2 :(得分:2)
你缺少, 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;
}
谢谢
答案 3 :(得分:0)
只需删除super.onBackPressed()即可使用
答案 4 :(得分:0)
请确保您没有在超级视图中调用onkeydown,因为它会先处理后退按钮。