Androidの電卓アプリがいちおう完成した。
式を計算するようにしていて、式の構文解析にはJavaCCを使用した。
ここの記事を参考に、構文定義を作成した。
単項の演算子を追加したりしたので、
JJTreeの記述方法を調べつつだったので、
簡単にできるだろうと思っていたが、意外と手こずった。
例えば、「0.8%」のように百分率で入力できるようにしたが、
「数値」と「数値+%」は、トークンを先読みしないと、規則が一意に定まらない。
そのため、以下のように構文定義するとエラーとなる。
void Value() #void: {} { PercentNumber() | Number() | <LPAREN> AddExpr() <RPAREN> } void Number(): { Token t;} { t = <NUMBER> { jjtThis.nodeValue = t.image;} } void PercentNumber(): {} { Number() <PERCENT> }
これは、LOOKAHEAD(2)でトークンを先読みすることで解決できた。
void Value() #void: {} { LOOKAHEAD(2) PercentNumber() | Number() | <LPAREN> AddExpr() <RPAREN> }
すでに電卓アプリならAndroidマーケットにいくつもあるが、
わざわざ自分で作ったのは、式をファンクションキー割り当てする機能が
欲しかったからだが、この機能の実現はAndroidのUIが思うように作れずにある程度妥協した。
「Edit」ボタンを押したときに、編集モードに移行したことがわかるように、
ボタンに色を付けたかったが、これがうまくいかない。
setBackgroundColorを使うと、ボタンのサイズより大きく塗りつぶされてしまった。
しかたないので色を付けるのは諦めて、ヒントメッセージをTextViewで表示することにした。
あと、ボタンの配置を画面サイズに対して均等になるように、
縦横にLinearLayoutを使ったが、
スマホで納得のいったデザインになっていたが、
タブレットで表示するとボタンが縦に間延びしてイマイチな感じになった。
ここも調整が難しいので妥協することにした。
ボタンのフォントも「*」が上よりなっているので、
バランスの良いフォントにしたいが、
ここも実用には問題ないので妥協した。
あと、はまったのが、入力した式と計算結果をTextViewに追加していって、
履歴をスクロールできるようにしたが、
自動で末尾にスクロールさせようとすると、
ScrollViewのfullScroll(View.FOCUS_DOWN)を呼んでもなぜかスクロールしなかった。
調べたら、postを使って非同期にfullScrollを呼ぶ必要があった。
自分用途に作ったアプリだが、
せっかくなので後日、アプリをAndroidマーケットに公開する予定。