Translate

BTemplates.com

Powered by Blogger.

2017年11月11日土曜日

2017-11-10 到達点メモ


やっと、クラッシュログの内容が分かった。
前のバージョンから以下のようなクラッシュログが何度か出ていました。


java.lang.IllegalArgumentException:
  at com.aaa.nononaga.voicetimerr.MainActivity$onCreate$1.onItemSelected (MainActivity.kt)
  at android.widget.AdapterView.fireOnSelected (AdapterView.java:1319)
  at android.widget.AdapterView.dispatchOnItemSelected (AdapterView.java:1308)
  at android.widget.AdapterView.selectionChanged (AdapterView.java:1299)
  at android.widget.AdapterView.checkSelectionChanged (AdapterView.java:1480)
  at android.widget.AdapterView.handleDataChanged (AdapterView.java:1456)
(以下略)

ずっと何が原因で起こるかわからなかったのですが、ようやくアプリを起動中に
ローケルを切り替える(言語を切り替えると)と発生するのを確認しました。

もしかすると複数の公用言語を持っている国は、場合によって良く切り替えたりするのかもしれません。

前の記事にonItemSelectedにnullが入る時があるから
エラーが出るという話をしましたが

改めて調べなおしたところ、赤字の部分の引数が
nullが入る時があるらしいと分かりました
            override fun onItemSelected(parent: AdapterView<*>, view: View,
                                        position: Int, id: Long) {

ですので、結果としては以下のようにViewをNullable型に変えてやれば解決します
            override fun onItemSelected(parent: AdapterView<*>, view: View?,
                                        position: Int, id: Long) {

これでクラッシュは起こらなくなるのですが、問題があります。
それは、他の文字は新しい言語に翻訳されるのですが
このSpinnerだけ元の言語のままという問題が起こります。

参考サイト:KotlinでParameter specified as non-null is null

というか見直したら、通知のテキストも更新されてなかった。
で、試行錯誤した結果、ローケルを変えてアプを復帰した時に
アクティビティを立ち上げる命令を出した元のアクティビティを完全に終了させることで
完全に翻訳された状態にすることができました。

機能が少ないアプリなので再起動してもあまり時間がかからないので
この手段が使えますがロードするデータが多いゲーム系や
複雑なアプリだと起動時間が長くなるため、やばい気がします

◆現在のローケルの取得方法
Locale.getDefault().language
これで、現在何語かを取得することができる。

参考サイト:Androidアプリで現在選択されているロケールを取得する

◆ローケルが変更したことを確認する

ローケルが変更したことを認識するようなメソッドがあれば早かったのだが
どうも見つからなかったので別な手段をとった。
具体的にはアプリが復帰する際に、予め保存したデータと
現在のローケルを見比べるという方法をとった。

また、注意事項として完全にアプを終了しないで呼び出した場合でも
onCreateがよびだされているようなので
アプリの初回起動時と、アプから離れたときと
アプを復帰させた場合のそれぞれのケースを考慮して
書かないといけない。
具体的には、
・アプリの初回起動時、もしくはローケルの保存データがない場合は、現在のローケルを保存する
・アクティビティから離れた場合、現在のローケルを保存する
*もしかするといらないかも
・アクティビティから復帰した場合、現在のローケルと保存したデータを見比べて
違う場合ならアプリの再起動。一緒なら無視。また、変更後のローケルを保存する


◆アプリの完全に終了方法。

簡単にいうとSystem.exit(0)を使った。
書いた場所はonDestroyの一番最後
無論これが推奨されていないのは知っているが
finishとかだとどうも完全に終了できないようなので
また、公式ドキュメントを見た感じだと
そもそもアプリを終了させること自体に
余り好意的でないように感じる

参考サイト:アクティビティをシャットダウンする


ただ、現状だと何処かロジックに問題があるようで
アプリを待機状態でローカライズの変更を行うのと
アプリを起動しないでローカライズを変更し、そのあとにアプリを立ち上げるのと
区別をつけることができていない。

煮詰まった感があるので今日はここまで





0 コメント:

コメントを投稿