fragment需要监听返回键时分两种情况,一种是有其他控件获取了焦点,另一种是没有其他控件获得焦点。
先看第二种情况,代码如下:
MyFragment.Java
- public class MyFragment extends Fragment {
- View listview;
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- listview = (View) inflater.inflate(R.layout.phonerecorder, null);
-
mListView = (ListView) listview.findViewById(R.id.listView);
-
init();
-
mListView.setOnItemClickListener(clickitemlistener);
-
// 设置下面三个状态才能监听返回事件
-
listview.setFocusable(true);//这个和下面的这个命令必须要设置了,才能监听back事件。
-
listview.setFocusableInTouchMode(true);
-
listview.setOnKeyListener(backlistener);
-
return listview;
-
- 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);
- }
- }
- // 返回键按下时会被调用
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == event.KEYCODE_BACK
- && event.getAction() == KeyEvent.ACTION_DOWN) {
- // TODO
- return true;
- }
- return false;
- }