2015年6月21日日曜日

Fragmentでバックキーイベントを拾う際の注意点


Fragmentでバックキーが押されたことを検知したくてこちらのサイトに紹介してある方法と同じように実装をしてみた。
しかし、バックキーが押されたイベントを拾うことができなかった。

 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は別の方法でフォーカスを当てる必要がある。

  • 方法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 件のコメント:

コメントを投稿