Android onBackPressed()没有被调用?

问题描述 投票:12回答:5

在我的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;
}
}

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

java android android-activity override back
5个回答
16
投票

这个问题已经回答了,但我想在这个主题中明确一些内容。大多数评论和回答指出使用super.onBackPressed(),这是不工作方法onBackPressed()的原因。但是让其他初学者知道这是不正确和重要的。方法onBackPressed()不需要使用super.onBackPressed()。例如,如果有人评论onBackPressed()super.onBackPressed()also就可以了。

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

  1. 由于logcat控制台中的错误过滤器,Log无法正常工作
  2. 由于错误的传递上下文,Toast不起作用
  3. 供应商错误地实施了操作系统。

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

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

对于Log,只需在logcat上设置正确的过滤器即可。

我不在乎是否有人现在给予了投票,但对其他初学者来说必须清楚,不得使用super.onBackPressed()

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


8
投票

onBackPressed()是一个默认操作,在API <5时从onKeyDown()调用,默认操作从API级别5及更高版本调用onKeyUp()。如果onKeyUp()没有调用super.onKeyUp(),则不会调用onBackPressed()

文档onKeyDown()

文档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
投票

你错过了,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;  
 }  

谢谢


0
投票

只需删除super.onBackPressed()即可


0
投票

确保你没有在超级视图中调用onkeydown,因为它首先处理后退按钮。

© www.soinside.com 2019 - 2024. All rights reserved.