2017年にもなっていまさらAndroid端末の物理キーボード対応をしてみたので調査内容をメモしておく。
全体的にめっちゃ書きかけ。あとでいろいろ追記するかも。
経緯
拙作のついっとぺーん1はそもそも物理キーボード対応をしていませんでした。
そんなアプリでガラホ(SHF31)での10キー操作が全然できないのを改善するのがそもそもの目的でしたが、ガラホはスクリーンのタップ操作ができない2 など開発対象として茨の道すぎるので、まずはNexus5XにBluetoothキーボードを接続し、物理キーボード対応から行うことにしました。
対応すべきこと
物理キーボード対応のためにやったことは概ね下記の通り。
- タッチモード・非タッチモードを理解する
- 端末のホーム等で、物理キーボードのEnterからアプリを起動するとアプリ起動時点でタッチモード、アイコンタップで起動すると非タッチモード
- フォーカスの概念を知る
- フォーカスの設定方法を理解する
-
focusable
とかclickable
とか -
requestFocus
とか<requestFocus>
とか -
android:nextFocusDown
とか
-
- フォーカスとデザイン
-
<selector>
で<item android:state_pressed="true">
を設定する
-
-
View
にonClickListener
などリスナーを付けるとフォーカスが自動設定されるのを注意する -
ListView
でEnterキー押下イベントを取れないときはdescendantFocusability
が必要かも - 初期フォーカスとタッチモード
-
<requestFocus>
タグを付けたViewが初期フォーカスになるらしい -
onGlobalFocusChanged
でタッチモードになったタイミングを捕捉し、初期フォーカスを設定するという裏技もある。非タッチモードからタッチモードになったときにフォーカスがどっか行ってしまうのを抑制するという意味で。ToolBar
が悪さしてるっぽいんだけど調査中。
-
descendantFocusability
について
ListView
の項目のXMLにてRootView
に対して android:descendantFocusability="blocksDescendants"
属性を付けるといい感じにイベントを取れるようになる的なやつ。
リンク集
- 【ListView Tips Vo.1】ListViewの子要素(アイテム)のClickがおかしくなる 〜主な原因と対処法〜 - Qiita
-
Android Touch Mode and Focus
- タッチモードとフォーカスについてよくまとまってる良記事
-
AndroidのListViewの子要素(ListItem)にButtonを設置したとき、子要素(ListItem)のonClickListenerが呼ばれなくなってしまうのをどうするか。 - ほねぶろぐ
-
android:descendantFocusability="blocksDescendants"
について
-
-
タッチクルーザーEXという仮想カーソルはあるけど「クリック」ができないので実質使えない ↩