しかし、バックキーが押されたイベントを拾うことができなかった。
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 件のコメント:
コメントを投稿