Android onBackPressed()没有被调用?

时间:2016-09-16 13:22:46

标签: java android android-activity override back

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

编辑:我正在谈论硬件后门(而不是动作栏)

5 个答案:

答案 0 :(得分:16)

这个问题已经回答了,但我想在这个主题中澄清一些问题。大多数评论和回答都指出使用super.onBackPressed(),这是无效方法onBackPressed()的原因。但是让其他初学者知道这是不正确和重要的。方法onBackPressed()不需要使用super.onBackPressed()。如果有人评论onBackPressed()super.onBackPressed()也有效。

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

  1. 由于logcat控制台中的错误过滤器
  2. ,Log无法正常工作
  3. 由于错误的传递背景,Toast不起作用
  4. 供应商错误地执行了操作系统。
  5. 通常,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()

文档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 :(得分: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,因为它会先处理后退按钮。