« 気になる挙動を調べてみた | メイン | Android 版のα1 リリース »

2012年04月30日

吉里吉里Java:: Android のメニュー

    

Android 3.0 以降でメニューボタンでの操作が廃止され、ActionBar による実装が推奨されている。
Android では互換性のため、AndroidManifest.xml で targetSdkVersion に Android 3.0 未満を指定すれば、画面下部にメニューボタンが追加される。
タブレット等ハードウェアボタンを全く搭載しないのであれば、他のボタンと同列に並ぶのでいいのだが、そうでない場合メニューボタンだけが表示されてずいぶん見た目が不格好になる。
Android 3.0 以降でメニューボタンなしでも操作出来るようにするためには、メニューなしでも操作出来た方が良い。
また、Android のメニューは、2階層までとなっているので、吉里吉里2のメニュー設定をそのまま持ってこられるようにするには、標準機能では足りない。
以上の理由により、Android 版ではメニューそのものを廃止してしまう事も考えたのだが、移植性も考え独自にメニューを実装する事にした。
ただ、このメニューは非推奨 ( 問題なく機能するようには作っている )。
当初標準のダイアログを使って実装する事を考えたが、チェックやラジオボタンの実装がやっかいなため、描画や操作は自前で実装してある。
メニューは以下のような表示になる。


メニューボタンを押すと表示され、タップで選べる。
バックボタンで階層を戻れ、メニュートップの時はメニューを閉じる。
表示中メニューボタンを押すと閉じる。
メニューで下位の項目がある場合は「>」が末尾に表示される。

画面に対して項目が大きいのは指で押す事を考慮しているため。
これより小さいと少し押しづらい。
高さが 50dip 以上になるようになっている (解像度に合わせたサイズになる) 。
高さを 50dip で割った数が縦方向の項目数となる。
割った時の余りは各項目に分散される (上の方の項目が 1px大きくなる可能性がある) 。
幅は、その階層で表示されるメニューの文字の幅によって計算される。
文字数が少ないと、次の画像のように横の項目数が増える。


横方向の項目数は、その階層のメニューの最大幅で画面幅を割った数で計算される。
1未満になる時は、1になる。
1になった時で、文字が幅を超える時はそのメニュー文字列はそのメニューに入るように文字が削られ末尾に「…」が付与される。
1画面内にメニューが入りきらない時はメニュー末尾に「▽次へ」が挿入され、そのメニューを押下する事ではみ出てメニュー項目を表示するメニュー表示に切り替わる。
2ページ以降では、最初に「△前へ」が表示され、前のメニュー項目に戻れるようになっている。
セパレータは非表示で、その項目自体ないものとして扱われる。
チェックがある場合は以下のように表示される。


ラジオボタンは次のように表示される。


文字、背景、線の色はリソースの colors.xml で指定可能になっている。
文字、背景は通常、押下、無効の3種類定義してある。

メニューボタンを搭載しない場合、画面下部にメニューを表示しないように AndroidManifest.xml の targetSdkVersion で API Level 11 以上を指定したときのことを考慮し、Window.showMenu() を追加する。
これによってメニューボタンを押してメニュー表示した時と同じ動作をする。
API Level 11 以上を指定し、メニューを使用する場合は、画面内にこのメソッドを呼び出すボタン等を配置しておかないとメニューでのみ実現している機能があるのなら、その機能を呼び出す事が出来なくなってしまうので注意する必要がある。

なお、矢印キーでの項目選択やEnterでの選択は現状実装されていない。



投稿者 Takenori : 2012年04月30日 18:17




comments powered by Disqus
Total : Today : Yesterday : なかのひと