スポンサー広告 - スポンサーサイト

--/--/-- (--) --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Android】簡単メモ帳 - バージョン 1.0.9

2012/05/03 (木) 21:22

バージョンアップ

■変更点
1.端末を横向きにした際に、横向きの画面に対応しました。
2.その他細かい不具合の修正

■詳細
1については、コメントで要望が寄せられていたので対応してみました。
が、これが一筋縄ではいかず(汗)
前回の記事で途中経過を書きましたが、あの時点ではレイアウトさえ考えれば良いだろうと思っていました。
が、それでけでは考慮不足であることが判明。
Androidアプリの仕組みであるライフサイクルに関係してくるのですが、
一時停止や復帰の時の各種ハンドラの起動にまつわる調整が必要になりました。
特に今回の調査でわかったのですが、画面の縦横(以下オリエンテーション)の変更は「コンフィグチェンジ」と呼ばれる現象で、オリエンテーションのみならず、その他の様々な状況で起こりえるのだという事がわかりました。
例えば、言語を変えたり、フォントを変えたりですね。
発生するであろう「コンフィグチェンジ」については以下のサイトをご覧ください。
ソフトウェア技術ドキュメントを勝手に翻訳

実はバージョン1.0.6のリリース後、メールで報告を受けていました。
「本日のメモを記入しているつもりが、本日では無い日付のメモとして上書きされてしまう。」
という内容でした。そこには再現方法までは書かれていなかったので、再現することができずに困っていました。
それが今回の横画面対応の調査を経て原因が判明したかもしれません。

●再現方法
①簡単メモ帳を起動してメモ入力画面へ。
②「<」「>」のボタンで日付を変えてホームボタンを押下して一時中断する。
③設定から端末全体で使用するフォントを変更して、再度簡単メモ帳を起動する。
この時に画面に表示される日付はなんと①の時の日付になります。が、メモの内容は②の内容になってしまいます。
ここで保存ボタンを押下すると、①の日付のメモが②の内容で上書きされてしまいます。
こんな感じで再現できます。結構レアな状況だと思うのですが、希望的観測ですかね(汗)
この状況がメールで報告のあった現象と同じかどうかはわかりませんが、可能性は高いと思います。

●原因
これは「コンフィグチェンジ」が発生した時に「public void onCreate(Bundle savedInstanceState)」が呼ばれる事に起因します。
そもそも「onCreate()」が何度も呼ばれることなど想定しておらず、しかも中途半端に「EditText」の中身は勝手に復元するとか、ちょっと困りものです。
個人的な使用方法として、長い間起動しっぱなしにする事が無かったので、完全に見逃しておりました(汗)
開けたら閉める!起動したら終了する!と叫びたいが、無理がありますね。とほー。

●対応
そんなわけで、以下対応方法です。
①「コンフィグチェンジ」発生時にコールされる「protected void onSaveInstanceState(Bundle outState)」を実装します。
 復元に必要な各種データを引数の「outState」オブジェクトに保存します。
②「public void onCreate(Bundle savedInstanceState)」で引数「savedInstanceState」オブジェクトがNULLかどうか判定し、
 NULLの場合だけ初回用の初期化を行います。
③「protected void onRestoreInstanceState(Bundle savedInstanceState)」を実装します。
 「onCreate()」の後に呼ばれます。
 引数の「savedInstanceState」オブジェクトには①で保存したデータが格納されているので、それを使って復元用の初期化を行います。

②の中で③の内容を行ってもよさそうですが、メモを編集したかどうかの検知用の「TextWatcher」がどうしても期待通りに動作せず、「onCreate()」のタイミングでメモデータを復元すると、「EditText」が書き変わったぜ!と言い張りました。
当然「removeTextChangedListener()」でリスナーをはずしてからメモデータを突っ込み、その後に「addTextChangedListener()」していたのですが上手くいかず。
仕方が無いのでその後に呼ばれるであろう「protected void onRestoreInstanceState(Bundle savedInstanceState)」で復元処理をする事にしました。
こちらだと思惑通りに動きました。

この対応はカレンダー画面とメモ入力画面に対して行いました。
検索結果画面では何度「onCreate()」が呼ばれても平気なのでそのままにしました。
カレンダー画面では、スライドで移動した年月のカレンダーが保持されるようにしました。
メモ入力画面では、編集中の日付の保持、メモデータの保持、編集フラグの保持等を行っています。

「protected void onRestoreInstanceState(Bundle savedInstanceState)」は「コンフィグチェンジ」後に必ず呼ばれるわけではなく、Androidが適宜状況を判断して呼ばれるようです。
今回のオリエンテーションの発生時には必ず呼ばれていました。

非常に参考になったというか、むしろのそのまま全部使わせてもらったのが以下のサイト。
Androyer in Japan 再起動への対応を考える
ソフトウェア技術ドキュメントを勝手に翻訳 7.3 実行時の変化への対処

んで、もはやおまけ程度な感じですが、カレンダー画面のレイアウトも変更しました。
これはスクリーンショットを張っておきます。
20120503-131313.png
あんまり良くなってない気がしますが、今後の課題という事でひとまずはこれで勘弁してください(汗)
「/res/layout-land」ってディレクトリを作って、「/res/layout」の中にある同名の設定ファイルを置いておくと、
横向きになった時には自動で前者の中の設定ファイルを使ってくれます。
「land」は「landscape」の略です。ここまで来ると予想できますが「layout-port」というディレクトリも有効です。もちろん「portrait」の略ですね。
要するに、縦用と横用のレイアウト設定ファイルを用意して、切り替えはAndroidに任せてしまっています。

2.については、1の説明中にある不具合の他にバージョン1.0.6からのもので、メモ入力画面の「EditText」に仕込んだ「TextWatcher」の部分に不味い部分がありました。
1の説明でも出てきていましたが、なんと「removeTextChangedListener()」せずに「addTextChangedListener()」していました。
「<」「>」のボタンが押される度に追加されていたので、メモリが無駄に消費されていた感じです。
ハンドラ内にデバッグ用のログ出力を仕込んだ時に気がつきました。なんか遷移するたびにログ出力の量が増えていく!!と。
処理的には編集フラグを立てるという簡単なものなので、動作に問題は起きません。
その他スペルミス等の修正を行っています。あまりにも恥ずかしい内容なので詳細はヒミツで(汗)

今回はボリュームたっぷりですが、アプリの見た目的には横画面に対応しただけという地味っぷりです。
それでも変更点が多いのと、作業的に2段階だったので外向きには2段階のバージョンアップで1.0.7⇒1.0.9としました。
また何か不具合や要望があれば対応していきたいと思います。
関連記事

コメントの投稿

非公開コメント

検索フォーム
RSSリンクの表示
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。