如何检测“向上”按钮是否被按下

12

在我的活动中,操作栏只显示左箭头和活动的标题。

当我按左箭头时,活动回退到上一个活动,但onKeyUp、OnkeyDown和OnBackPressed方法中没有注册任何事件。

但是,当我在手机底部按下返回键时,活动会回退到上一个活动,并且所有的onKeyUp、OnKeyDown和OnBackPressed方法都会注册一个事件(在logcat中)。

我该如何捕获那个左箭头(我想它被称为向上按钮)?

我需要捕获这个按键的原因是为了在onPause方法中知道该活动是由用户销毁还是由系统销毁(例如,如果用户切换到另一个活动)。

进一步研究后,我发现向上按钮会触发一个事件,该事件会被onOptionsItemSelected方法捕获,因为菜单中没有其他按钮,所以我知道就是这个按钮。


谢谢。我添加了代码来测试主页键,以防将来我会添加其他操作项到操作栏中。 - Zvi
2个回答

12

请查看http://developer.android.com/guide/topics/ui/actionbar.html#Handling

处理操作项的点击事件

当用户按下操作项时,系统会调用您的Activity的onOptionsItemSelected()方法。使用传递给此方法的MenuItem,您可以通过调用getItemId()来识别该操作。这将返回由标签id属性提供的唯一ID,以便您进行适当的操作。例如:

@Override 
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items 
    switch (item.getItemId()) {


        case android.R.id.home:
            onUpButtonPressed(); 
            return true; 



        case R.id.action_search:
            openSearch(); 
            return true; 
        case R.id.action_compose:
            composeMessage(); 
            return true; 
        default: 
            return super.onOptionsItemSelected(item);
    } 
} 
注意:如果您通过Fragment类的onCreateOptionsMenu()回调从片段中充气菜单项,则当用户选择其中一个项目时,系统将为该片段调用onOptionsItemSelected()。但是,活动有机会先处理事件,因此系统首先在活动上调用onOptionsItemSelected(),然后再为片段调用相同的回调函数。为确保活动中的任何片段也有机会处理回调,请始终将调用传递给超类作为默认行为,而不是在不处理项目时返回false。
要将应用程序图标启用为向上按钮,请调用setDisplayHomeAsUpEnabled()。例如:
@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);

    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    ... 
} 

谢谢!虽然这个线程很旧了,但这是唯一有效的解决方法!(因为我遇到了同样的问题)。谢谢。 - Yashovardhan99

4

是的,你说得没错,在onOptionsItemSelected方法中可以检测到向上按钮是否被按下。以下代码应该可以正常工作:

public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
    // Do something here. This is the event fired when up button is pressed.
    return true;
}
return super.onOptionsItemSelected(item); 
}

太棒了!谢谢! - Sandeep Yohans

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