fragment需要监听返回键时分两种情况,一种是有其他控件获取了焦点,另一种是没有其他控件获得焦点。
先看第二种情况,代码如下:
MyFragment.Java
[java] view plain copy
- 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.requestFocus();
- 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中
[java] view plain copy
- private Fragment fg; // fg记录当前的Fragment
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (fg instanceof MyFragment) {
- ((MyFragment) fg).onKeyDown(keyCode, event);
- }
- }
在MyFragment中
[java] view plain copy
- // 返回键按下时会被调用
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == event.KEYCODE_BACK
- && event.getAction() == KeyEvent.ACTION_DOWN) {
- // TODO
- return true;
- }
- return false;
- }