为什么onBackPressed()没有被调用?

10

我试图重写onBackPressed()方法。但是,当我点击操作栏中的返回按钮时,它似乎无法检测到。

我目前有这段代码:

@Override
public void onBackPressed()  {

    Log.i("DATA", "Hit onBackPressed()");
    super.onBackPressed();

}

我的日志消息在LogCat中从未出现。我知道这个日志语句是有效的,因为它是从另一个具有不同消息且会在LogCat中显示的方法中复制的。

我已经搜索过答案,并尝试使用onKeyDown并检测是否点击了后退按钮,但仍然存在同样的问题。 项目信息:

  • Android Studio 0.9.3
  • 该方法位于空白活动中
  • 目标SDK为21
  • 最小SDK为15
  • 测试设备为三星Galaxy 5手机(非模拟器)

任何帮助都将不胜感激!!

编辑:

这是我的工作代码副本(这是测试代码,因此活动名称不具描述性):

public class MainActivity2 extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_activity2);
    getActionBar().setDisplayHomeAsUpEnabled(true);//Displays the back button
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main_activity2, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:

            Log.i("DATA", "Hit Actionbar Back Button");

            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

}

现在,"Hit Actionbar Back Button"消息将出现在LogCat中。


动作栏中的返回按钮实际上不是一个返回按钮,而是“向上”按钮。请参见http://developer.android.com/training/implementing-navigation/ancestral.html。 - njzk2
2个回答

25

onBackPressed() 方法在用户点击硬件返回键(或导航栏中的“向上”按钮)时调用,而不是操作栏中的按钮。要处理后者,需要重写 onOptionsItemSelected() 方法。示例:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // click on 'up' button in the action bar, handle it here
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}    

2
它不一定是硬件按钮,也可以在导航栏中的软后退按钮上工作。 - Lars
@Lars 哎呀,好提醒!到目前为止我用过的所有安卓手机都有硬件导航按钮,因此我总是忘记导航栏中的按钮。 - aga
谢谢,这个救了我免去了解决错误问题的麻烦。 - Val Okafor
在花费了这么多时间之后,我找到了这个答案,感谢它起作用了。 - Shiva

0
请尝试此代码,
public class MainActivity2 extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}


@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();

    Toast.makeText(getApplicationContext(), "back press is call", Toast.LENGTH_LONG).show();
}
}

Toast仍未出现。@aga给出了正确的答案。谢谢! - kkimble006
@kkimble006,你能分享一下你的活动完整代码吗? - Krunal Indrodiya
@kkimble006 我在手机和模拟器上测试了这段代码,它运行良好,请检查一下。 - Krunal Indrodiya
1
我测试了这段代码,它可以与硬件返回按钮配合使用。我的兴趣在于覆盖操作栏返回按钮。但是这段代码对此无效(我已经测试过了)。不管怎样,还是谢谢@KrunalI! - kkimble006

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接