Android
ガラホ

いまさらAndroid端末の物理キーボード対応を試みた備忘録

2017年にもなっていまさらAndroid端末の物理キーボード対応をしてみたので調査内容をメモしておく。

全体的にめっちゃ書きかけ。あとでいろいろ追記するかも。

経緯

拙作のついっとぺーん1はそもそも物理キーボード対応をしていませんでした。
そんなアプリでガラホ(SHF31)での10キー操作が全然できないのを改善するのがそもそもの目的でしたが、ガラホはスクリーンのタップ操作ができない2 など開発対象として茨の道すぎるので、まずはNexus5XにBluetoothキーボードを接続し、物理キーボード対応から行うことにしました。

対応すべきこと

物理キーボード対応のためにやったことは概ね下記の通り。

  • タッチモード・非タッチモードを理解する
    • 端末のホーム等で、物理キーボードのEnterからアプリを起動するとアプリ起動時点でタッチモード、アイコンタップで起動すると非タッチモード
  • フォーカスの概念を知る
  • フォーカスの設定方法を理解する
    • focusable とか clickable とか
    • requestFocusとか<requestFocus>とか
    • android:nextFocusDown とか
  • フォーカスとデザイン
    • <selector><item android:state_pressed="true"> を設定する
  • ViewonClickListener などリスナーを付けるとフォーカスが自動設定されるのを注意する
  • ListView でEnterキー押下イベントを取れないときは descendantFocusability が必要かも
  • 初期フォーカスとタッチモード
    • <requestFocus> タグを付けたViewが初期フォーカスになるらしい
    • onGlobalFocusChanged でタッチモードになったタイミングを捕捉し、初期フォーカスを設定するという裏技もある。非タッチモードからタッチモードになったときにフォーカスがどっか行ってしまうのを抑制するという意味で。ToolBarが悪さしてるっぽいんだけど調査中。

descendantFocusability について

ListViewの項目のXMLにてRootViewに対して android:descendantFocusability="blocksDescendants"属性を付けるといい感じにイベントを取れるようになる的なやつ。

リンク集



  1. Twitterのついっとぺーん(ツイッター) - Google Play の Android アプリ 

  2. タッチクルーザーEXという仮想カーソルはあるけど「クリック」ができないので実質使えない