Android - Fragment中设置双击返回键退出程序
双击返回键,那么肯定要先从监听返回键说起。
监听返回键
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;
}
};