Android onBackPressed() 没有被调用?
Android onBackPressed() is not being called?
在我的从 AppCompatActivity 扩展的 MainActivity 中,我想像这样覆盖 onBackPressed 方法:
@Override
public void onBackPressed() {
Log.d("MainActivity","onBackPressed");
Toast.makeText(getApplicationContext(),"onBackPressed",Toast.LENGTH_SHORT).show();
}
但是没有调用 onBackPressed。如果我不覆盖 onBackPressed,应用程序会关闭,当我按下后退按钮时,如果我覆盖它,它不会关闭。
我的其他 activity 看起来像这样:
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();
@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()
并且这是不工作方法 onBackPressed()
的原因。但这是不正确的,重要的是要让其他初学者知道。 onBackPressed()
方法不需要使用 super.onBackPressed()
。 onBackPressed()
也适用于有人,例如,评论 super.onBackPressed()
。
正如提问者所写,他不会使用 super.onBackPressed()
因为它会关闭 activity。因此,它不起作用的原因可以分为三个可能的原因:
- 由于 logcat 控制台中的过滤器错误,日志无法正常工作
- 由于传递的上下文错误,Toast 无法工作
- OS 供应商实施错误。
通常,吐司通过传递正确的上下文来工作。对于提问者,只需传递 this
即可。
@Override
public void onBackPressed() {
Log.d("MainActivity","onBackPressed");
Toast.makeText(this,"onBackPressed",Toast.LENGTH_SHORT).show();
}
对于日志,只需在 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
*/
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);
}
}
只需删除 super.onBackPressed() 即可
确保您没有在超级视图中调用 onkeydown,因为它先处理后退按钮点击。
在我的从 AppCompatActivity 扩展的 MainActivity 中,我想像这样覆盖 onBackPressed 方法:
@Override
public void onBackPressed() {
Log.d("MainActivity","onBackPressed");
Toast.makeText(getApplicationContext(),"onBackPressed",Toast.LENGTH_SHORT).show();
}
但是没有调用 onBackPressed。如果我不覆盖 onBackPressed,应用程序会关闭,当我按下后退按钮时,如果我覆盖它,它不会关闭。
我的其他 activity 看起来像这样:
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();
@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()
并且这是不工作方法 onBackPressed()
的原因。但这是不正确的,重要的是要让其他初学者知道。 onBackPressed()
方法不需要使用 super.onBackPressed()
。 onBackPressed()
也适用于有人,例如,评论 super.onBackPressed()
。
正如提问者所写,他不会使用 super.onBackPressed()
因为它会关闭 activity。因此,它不起作用的原因可以分为三个可能的原因:
- 由于 logcat 控制台中的过滤器错误,日志无法正常工作
- 由于传递的上下文错误,Toast 无法工作
- OS 供应商实施错误。
通常,吐司通过传递正确的上下文来工作。对于提问者,只需传递 this
即可。
@Override
public void onBackPressed() {
Log.d("MainActivity","onBackPressed");
Toast.makeText(this,"onBackPressed",Toast.LENGTH_SHORT).show();
}
对于日志,只需在 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
*/
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);
}
}
只需删除 super.onBackPressed() 即可
确保您没有在超级视图中调用 onkeydown,因为它先处理后退按钮点击。