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这个是触摸是否能获得焦点。