onKeyDown
Activity可以通过重写onKeyDown(int keyCode, KeyEvent event),很容易的监听物理返回键事件,而Fragment并不能重写物理键监听事件。在一个Activity多个Fragment页面的应用中,很多时候有必要的监听每个Fragment返回事件,并对每个Fragment做特殊的数据处理。如果将每个Fragment的返回事件都在FragmentActivity中监听消费,那么其onBackPressed()的代码将会比较混乱;
Activity的onKeyDown
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) {//按下返回键 moveTaskToBack(false);//让程序进入后台但不销毁 这里写自己的逻辑代码就可以了 return true;//消费了返回事件 } return super.onKeyDown(keyCode, event); } 复制代码
返回 true 表示已经消耗了返回的时间,返回false表示没有消耗,依旧会执行返回。
Fragment的onKeyDown
@Override public void onResume() { super.onResume(); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { if (keyCode == KeyEvent.KEYCODE_BACK && keyEvent.getAction() == KeyEvent.ACTION_UP) { //拦截到的返回事件 return true; } return false; } }); } 复制代码
getView返回的就是你的根布局view,setFocusable这个是用键盘是否能获得焦点,setFocusableInTouchMode这个是触摸是否能获得焦点。