在Android开发中,常常会遇到某个Activity中要求改变后退键的操作逻辑,例如,需要连续按两下才能退出当前Activity等。这种情形中,我们通常的做法有两个:①重写Activity中的onKeyDown方法 ②重写Activity中的onBackPressed方法。onKeyDown方法会在用户按下按键后回调,可根据keyCode来判断用户是否按下回退键,加以判断;onBackPressed则是直接在用户按下回退键时调用。通常会有如下代码:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    //按下的如果是BACK,同时没有重复
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
        //这里写一下逻辑代码
        return true;//返回true则不会处理回退事件;
       //返回super.onKeyDown(keyCode, event)则表示按照Android中默认方式处理
    }
    return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
    // 这里处理逻辑代码
    //return super.onBackPressed(); //如果要退出则返回
}

但是,最近在做一个TabHost切换效果的界面时,要求其他Tab按回退键时直接退到Home的Tab中,Home的Tab按回退键则退出当前放TabHost的Activity,于是我重写了那两个方法,发现都没有被调用的。如果在对应Tab中渲染的子级的Activity中重写则会对应的调用。通过差一些资源,发现了,在父级容器的Activity中需要重写dispatchKeyEvent方法,具体如下:

@Override
public boolean dispatchKeyEvent(KeyEvent event) { 
       if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
           //这里处理逻辑代码
           return true; 
       } 
       return super.dispatchKeyEvent(event); 
}

暂无相关文章