Fragment単位でハンドリングしたい場合もありますよね。
Activity単位でBack keyをハンドリングする場合
1 2 3 4 5 6 7 8 |
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ // なんらかの処理 return true; } return false; } |
これで事足りる場合はよろしいですがFragmentでもやってみましょう
Fragment単位でBack keyをハンドリングする場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@Override public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState){ View v = inflater.inflate(R.layout.fragment1, null); v.setFocusableInTouchMode(true); v.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { // 何らかの処理 return true; } return false; } }); return v; } |
こんな感じになります。
setFocusableInTouchMode(true)を忘れると拾えないので注意です。
ポイント
1 |
&& event.getAction() == KeyEvent.ACTION_UP |
はクリックの際にDownとUpの2つのイベントが飛んでいるので、その片方をとってあげるようにしないと2回動いてしまいます。
応用例: DialogFragmentだったら
1 2 3 4 5 6 7 8 9 10 |
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { //何らかの処理 return true; } return false; } }); |
上のやつをこんな感じに応用すればできます。