【问题标题】:Android onBackPressed() is not being called?Android onBackPressed() 没有被调用?
【发布时间】:2017-01-24 17:57:17
【问题描述】:

在从 AppCompatActivity 扩展的 MainActivity 中,我想像这样覆盖 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;
}
}

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

【问题讨论】:

  • 使用 onKeyDown 方法来覆盖返回操作
  • ...您可以轻松地将该代码放入 onBackPressed() 中,无需 onKeyDown 。来自文档:Called when the activity has detected the user's press of the back key. The default implementation simply finishes the current activity, but you can override this to do whatever you want. 这种行为肯定还有其他问题。
  • @Steve:你是否为返回按钮覆盖了onKeyDown?因为如果您在代码中的任何地方执行此操作,可能您还没有返回 true 并且不会调用 onBackPressed....
  • 您的 onBackPressed() 方法运行良好。问题不存在
  • @Opiatefuchs Log 和 Toast 都不起作用,但我现在切换到 onKeyDown 方法并且它起作用了。

标签: java android android-activity overriding back


【解决方案1】:

这个问题已经回答了,但我觉得在这个主题中要澄清一些东西。大多数 cmets 和答案都指出使用super.onBackPressed(),这是导致方法onBackPressed() 无效的原因。但让其他初学者知道这是不正确的和重要的。方法 onBackPressed() 不需要使用 super.onBackPressed()onBackPressed() 也适用于某人,例如,评论 super.onBackPressed() out。

正如提问者所写,他不会使用super.onBackPressed(),因为它会关闭活动。因此,导致它无法正常工作的原因可以分为三个可能的原因:

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

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

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

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

我不在乎现在是否有人投反对票,但其他初学者必须清楚,不能使用super.onBackPressed()

不管怎样,使用onKeyDown()也是一种解决方案。

【讨论】:

    【解决方案2】:

    onBackPressed() 是从 API 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
         */
        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);
        }
    }
    

    【讨论】:

    • 这是操作栏中后按的正确答案。
    • public BOOLEAN onKeyUp... 你在这里返回“BOOLEAN”吗?
    【解决方案3】:

    你不见了,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() 将关闭活动。您可以轻松地覆盖它并将其注释掉,该方法将在没有 super.OnBackPressed() 的情况下工作
    • super.onBackPressed();什么也没做,但出于某种原因 onKeyDown 对我有用。
    • 当然,onKeyDown 会起作用,只需在评论中尝试我的解决方案并传递正确的上下文...... onBackPressed 应该可以工作......
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      只需删除 super.onBackPressed() 就可以了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 2017-10-28
        • 2016-08-18
        • 1970-01-01
        相关资源
        最近更新 更多