しかし、バックキーが押されたイベントを拾うことができなかった。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.myfragment, container, false); view.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) Log.w(TAG, “on pressed back key”); return false; } }); view.setFocusableInTouchMode(true); return view; }
もっとよく調べてみると、バックキー等のハードウェアキーのイベントを拾うためにはそのViewにフォーカスが当たっている必要があることがわかった。
テキストエディット等はタッチすればフォーカスが当たるがFragmentは別の方法でフォーカスを当てる必要がある。
したがって、先ほどのコードは下記のように書く必要がある。
テキストエディット等はタッチすればフォーカスが当たるがFragmentは別の方法でフォーカスを当てる必要がある。
- 方法1:レイアウトファイルに書いたFragmentの属性にandroid:focusable = "true"を入れる
- 方法2:javaのコード上でrequestForcus()を呼ぶ
したがって、先ほどのコードは下記のように書く必要がある。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.myfragment, container, false); view.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) Log.w(TAG, “on pressed back key”); return false; } }); view.setFocusableInTouchMode(true); view.requestFocus(); return view; }
0 件のコメント:
コメントを投稿