目录

双击返回键,那么肯定要先从监听返回键说起。

监听返回键

Fragment需要监听返回键时分两种情况:一种是有其他控件获取了焦点,另一种是没有其他控件获得焦点。

先看第二种情况

public class MyFragment extends Fragment {  
    @Override    
    public View onCreateView(LayoutInflater inflater, ViewGroup container,    
            Bundle savedInstanceState) {    
        View rootView = inflater.inflate(R.layout.history, container,    
                false);    

        // 设置下面两个状态才能监听返回事件  
        lv.setFocusable(true);  
        lv.setFocusableInTouchMode(true);  
        lv.setOnKeyListener(backListener);  

        return rootView;    
    }    

    private View.OnKeyListener backListener = new View.OnKeyListener() {  
        @Override  
        public boolean onKey(View v, int keyCode, KeyEvent event) {  
            if (keyCode == KeyEvent.KEYCODE_BACK  
                    && event.getAction() == KeyEvent.ACTION_DOWN) {  
                // ToDo  
                return true;  
            }             
            return false;  
        }  
    };  
}  

第一种情况

第一种情况则需要在Activity中监听onKeyDown事件,贴出关键代码

在Activity中

private Fragment fg;    // fg记录当前的Fragment  

@Override  
public boolean onKeyDown(int keyCode, KeyEvent event) {   
    if (fg instanceof MyFragment) {  
        ((MyFragment) fg).onKeyDown(keyCode, event);  
    }  
}  

在MyFragment中

// 返回键按下时会被调用  
public boolean onKeyDown(int keyCode, KeyEvent event) {  
    if (keyCode == event.KEYCODE_BACK  
            && event.getAction() == KeyEvent.ACTION_DOWN) {  
        // TODO  
        return true;  
    }             
    return false;  
}  

这样就能通过Activity监听按键,然后调用Fragment定义的方法。

实现

既然上面已经说得这么清楚,那么直接贴代码

        //设置下面两个状态才能监听返回事件
        view.setFocusable(true);
        view.setFocusableInTouchMode(true);
        view.setOnKeyListener(backListener);
    private long exitTime = 0;
    private View.OnKeyListener backListener = new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK
                    && event.getAction() == KeyEvent.ACTION_DOWN) {
                // ToDo
                if ((System.currentTimeMillis() - exitTime) > 2000) {
                    Toast.makeText(getActivity(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
                    exitTime = System.currentTimeMillis();
                } else {
                    getActivity().finish();
                    System.exit(0);
                }
                return true;
            }
            return false;
        }
    };