こんにちは、やぎにいです。
やぎすけ Advent Calendar 2016の8日目です。
昨日は僕がButterKnifeを使ってソースコードのダイエットをするを書きました。
今日はAndroidプロジェクトを作って結構な確率で導入するライブラリで書いた4つ目のIcepickの使い方をまとめたいと思います。
Icepickの導入もいつも通りbuild.gradle
に以下を追加してあげます。
1 2 3 4 5 6 7 | repositories { maven {url "https://clojars.org/repo/"} } dependencies { compile 'frankiesardo:icepick:3.2.0' provided 'frankiesardo:icepick-processor:3.2.0' } |
このライブラリもButterKnife同様、特にアプリケーションクラスでの初期化や設定などは必要ありません。build.gradle
をに依存関係を追加したらあとは使うだけです。
Androidアプリを開発するときに、アクティビティ(やフラグメントなどのUI系)の状態が変わるのを考慮してコードを書く思います。
ライフサイクルを調べて処理を書いたりすることが多々あると思いますが、意外なところで破棄されたりします。例えば端末を回転させたりとか(回転を抑制してない場合)すると簡単に破棄されたりします。
そこで困るのが、EditText
に入力していた値やTextView
で表示していた値が保持されなかったりすると、ユーザはもう一度値を入力しなきゃならなくなったりしてとても不便なアプリになってしまいます。
そんなときはonSaveInstanceState
メソッドとonRestoreInstanceState
メソッドをしっかり使って状態の保存復元を行います。
それを少し楽にさせるライブラリがIcepickになります。
簡単です、保持したい変数にアノテーション@State
をつけIcepick#saveInstanceState
とIcepick#restoreInstanceState
を呼んであげるだけです。
実際にEditText
が1つ存在しており、その中の値を保持するようなソースを書いてみます。 (ついでにEditText
は昨日紹介したButterKnife
を使います)
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 | public class MainActivity extends AppCompatActivity implements RecyclerViewAdapter.Listener { @State String editTextValue; @BindView(R.id.editText1) EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); editTextValue = editText.getText().toString(); Icepick.saveInstanceState(this, outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Icepick.restoreInstanceState(this, savedInstanceState); editText.setText(editTextValue); } } |
以上のような感じになります。
いちいちoutState.putString(KEY, VALUE);
などをいっぱい書かずに@State
アノテーション付きの変数にさえ入っていれば保持されるので楽になりました。
あんまりEditText
から値を取り出して変数へツッコミとすると保持したい物分の変数が増えるので、個人的にはButterKnife
+Icepick
なライブラリがほしいです。(@BindState EditText editText
とか書くとButterKnife
も使えるし、中の値もIcepick
的に保持してくれるような感じで。)
本日は短いですが、以上がIcepickの使い方になります。このライブラリもButterKnife
同様、ソースコードのダイエットにとても貢献してくれるライブラリです。
onSaveInstanceState
でめちゃくちゃいっぱい描いちゃってる……みたいな方は導入の価値があると思います。が、ButterKnife
とはちょっと違って導入の場面を考えないと逆に変数が多くなってしまう……みたいなことになってしまうのでそこは十分にご注意を。
最後に注意としてIcepick
はいろんなライブラリに依存しており芋づる式で追加されるのでメソッド数が少ない場合は注意です。Proguard
を使う際はGithubのREADMEに設定が描いてあるのでそれを使ってあげましょう。
以上、やぎにいでした!
<< Androidアプリ開発のちょっとした小ネタ ButterKnifeを使ってソースコードのダイエットをする >>
2018やぎ小屋