11

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

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

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

我怎样才能捕捉到那个左箭头(我认为它被称为向上按钮)?

我需要捕获关键的原因是在 onPause 方法中知道活动是由用户而不是由系统破坏的(例如,如果用户切换到另一个活动)。

通过进一步调查他的问题,我发现 UP 按钮提供了一个由 onOptionsItemSelected 方法捕获的事件,并且由于菜单上没有其他按钮,我知道它是这个按钮。

4

2 回答 2

11

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

处理对操作项的点击

当用户按下一个动作时,系统会调用您的活动的 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);
    ... 
} 
于 2015-08-06T23:25:55.727 回答
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); 
}
于 2015-08-06T23:24:26.030 回答