2022年11月1日火曜日

Android: EditText で例外が発生しアプリが落ちる

意外と簡単に例外が発生して愚痴りたいと思いますw

簡単な入力画面をAndroidで作ってみようかと思って試行錯誤する事、早数か月。

もしかしてAndroidでも事務処理系のアプリで結構できるかもと思い確認作業から始めてみると、

・印刷出力 とりあえずPDF出力ができるから後はどうにでもなりそう。
・データ とりあえず基幹系は別としてSqlite3使えるから何とかなりそう。
・画面入力 とりあえず何とかなるんじゃね?

とかなり安易にとっかかり始めたものの、派手に壁にぶち当たりながら進めていたり。

最初はPDF出力が結構昔から標準だったというのを知らず今まで過ごしていたので意外でした。使えるか使えないかは別として。

 

まずAndroidでは今まで扱ったことのなかったPDFへの出力を行ってみることに。つまずきながらも意外と実装面では使えそうな雰囲気。

データベース関連では適当なライブラリを使って最悪Sqlite3を扱えばいいかな?と思っていたところRoomなるものの存在を知って、そこから手探り状態でなんとか扱えるかな?という感じに。

そして画面周りに入ってきたわけです。

思い返せば簡単なリストビュー形式の表示を行うアプリすら色々考えているうちに作る気力が失せてゆき、形にならずに終わってるのを考えると画面でかなり躓くのは明らかだったわけですが…

ある程度割り切ってしまうつもりだったのですが、色々といじっているうちに欲が出てくるわけで、キーボード操作はとりあえず置いておくつもりですが、画面に表示されるキーボード操作でそれなりに入力しやすくしたいわけで…

入力操作で地味にきついのが、画面のキーボードではタブやカーソルキーがないのでまともな入力画面を入力しようとするとかなりきつかったり、エンターなんだか確定ボタンなんだかその都度切り替わってしまう謎のボタンの存在と言ったところです。

タッチパネルだけの操作と言うことを考えると、ずいぶんと扱いやすいとはいえ、いざ入力をしようとするとかなりきつい気がします。

で、ようやく本題になりますが、入力項目から次の項目に移るための設定として設定項目が結構ある感じなのですが、それでもとりあえずこれでいいのかなと思える記事を目にしたのでEditTextのandroid:nextFocusForward="@+id/editSecond"とandroid:imeOptions="actionNext"を設定してみました。

最初はnextFocusForwardのみ設定を行っても思い通りに移動してくれずに悩んでいたのですが、imeOptionsもしていするとようやく思った感じに動き始めました。

ですが、微妙なのが画面キーボードに「←」「→」のボタンがあるのでそれで移動すると微妙な感じに…

設定項目にnextFocus~系のものは他にLeft / Right / Up / Downとあり、謎のClusterForwardというものまで…

Windowsだと、単純にタブオーダーを設定すればそれなりに動いてくれるわけですが、Androidでは設定項目は多いものの、基本的に移動先のViewを指定する必要があるようです。

そこで気になったのが、「もし移動先のフィールドが無効状態だったら?」と言うことです。画面の入力状態に合わせて入力フィールドの無効化や非表示化は行いたいところですが、Windowsの場合は明確な順序があるので、仮に次のフィールドが無効化されていたところで次のオーダーが明確に存在するわけです。AndroidはそれがViewに直接紐づいているので…移動先のViewが無効化されてたらその先のViewを辿ってくれるとかしてくれるのかな?すごいなぁ…とか考えていましたが、移動させようとした瞬間にアプリは閉じられ落とされました。

結果はとても単純でした。

java.lang.IllegalStateException: focus search returned a view that wasn't able to take focus!

はぁ…まじかぁw まぁそうだよなぁw と言った感じですが、やっぱり画面系の実装めんどくせぇw

 

でnextClusterForwardってなんだろな?と検索してみると、Defines the next keyboard navigation cluster. 次のキーボード ナビゲーション クラスタを定義します。

キーボードクラスタってなんだよ?って話で…検索してみると、Android 8.0の英語のドキュメントが引っかかりました。(日本語版のページではこのキーワードが存在せず、検索できませんでしたが、キーボードクラスタという言葉の前後の説明は英語版と同様のような感じでしたが、図が無かったりするので、英語版を見た方がわかりやすいっぽい)

つまるところ、clusterと言っているのはViewGroupなどでグループ化された単位でそのグループ間の移動の際に参照される設定値の様です。

そもそも「Androidで複雑な画面定義で入力項目を設定してくれるな」という意思が強く感じます。そもそもデフォルトの移動順序が微妙すぎるのが問題で、ConstraintLayoutを押している割に、地味に実装が弱すぎるんだよなぁ…というのが作られた当初から感じていることだったり。画面周りは全くスマートじゃない。

 と言う愚痴でした。

単純に入力項目が並んでいるだけなら問題ないんですが、狭い画面をそれなりに有効活用とすればするほど、込み入ってくるというジレンマ

最初はリストビューで直接入力できるようにと思っていたものの、結局明細単位の表示に切り替えて編集することにしたのにもかかわらず、思った通りのタブ移動にならないとかキツイw


0 件のコメント:

コメントを投稿