Translate

BTemplates.com

Powered by Blogger.

2017年11月11日土曜日

2017-11-11 到達点メモ


VoiceTimerで起きていたクラッシュログに出ていた問題の対策の続き

昨日の記事の一部抜粋

>>アプリを待機状態でローカライズの変更を行うのと
>>アプリを起動しないでローカライズを変更し、そのあとにアプリを立ち上げるのと
>>区別をつけることができていない。

ようやく何とか対策ができた。
最初は、onResumeとかonPause辺りで、プリファレンス辺りにデータを保存してその組み合わせで出来ないのかとか、バックキーを押したときにプリファレンス辺りにデータを保存してできないのか等を考えて実際試してみましたが駄目でした。

話から外れるが、Androidの三つのボタンの名称を忘れやすいのでここにメモしておく、
・ホームボタン
・戻るボタン
・メニュー・マルチタスクボタン
参考サイト:Androidの3つのボタン

検証した結果、ローケル変更を行うとアプリケーション自体にonCreateが呼び出されます。
その為、タスクから呼び出すのと、完全に終了したアプリを呼び出されるのに違いがほとんど無いようです。

今回は難しそうだったので検証はしていないのですが
調べたところ、リストから削除した方法を一応検知する方法があるみたいです。
具体的には、serviceを追加するとタスク一覧から指でスワイプして削除した場合
onTaskRemovedでそれを検知できるらしいです。

参考サイト:How to detect app removed from the recent list
参考サイト:Differentiate between Android killing the app and user swiping it off on the recent apps list

で、さんざん悩んだ結果ふと閃いたことがありまして。

Spinnerの表示元はString.xmlで宣言している内容を使っており、
Spinnerのオブジェクトの表示テキストの内容と本来の表示するべきString.xmlの内容が
一致していないことをうまく利用できるのではと思いついたので
試したところうまくいきました。

var res:Resources  = getResources()
var ta:TypedArray = res.obtainTypedArray(R.array.time_value_list)
if((paramsManager.locale_language == whenResume_local.language)||               (time_spinner.selectedItem.toString().equals(ta.getString(time_spinner.selectedItemId.toInt())))){
            Log.d(TAG,"onResume_finished")
        }else{
            Log.d(TAG,"ChangeLocale!!")
            restartFlag = true
            // アクティビティ終了
            this.finish()
}

こんな感じです。
まぁ、対処としてはどうなのよという思いはありますが
この方法だと変更箇所も多くないですし、
正直楽だったので……。
それにいつまでもクラッシュが発生する状態よりは良いかなと思っていたので
対処しました。

参考サイト:Android, arrays.xml で定義した配列を利用する
参考サイト:SpinnerとTextViewを用いたAndroidサンプルアプリ
参考サイト:スピナー (Spinner) で選択されたアイテムの取得

なんか一仕事した感があるので今日はここまで。

0 コメント:

コメントを投稿