2011年4月6日水曜日

Android 画面遷移での値の受け渡し

画面遷移時に値を受け渡す。IntentにputExtraで値を追加させて起動させてやることで行えることは知っていた。値としてObjectも可能だったことは知らなかった。初めに見たサンプルを覚えそれが全てだと思い込み、どんなときでもその方法を使う。これを馬鹿の一つ覚えと言う。

今までは馬鹿の一つ覚えで下記のように各要素をputExtraしてた。
        Intent intent = new Intent(this, NextAct.class);
        intent.putExtra("TITLE", novel.getTitle());
        intent.putExtra("DESC", novel.getDesc());
        intent.putExtra("PRICE", novel.getPrice());
        startActivity(intent);
(novelはtitle,desc,priceを持つクラスのインスタンス)
で、NextActでは下記のように受け取る。
        Intent intent = getIntent();
        title = intent.getStringExtra("TITLE");
        desc = intent.getStringExtra("DESC");
        price = intent.getIntExtra("PRICE", 0);
まず、三つもputExtraを書くの面倒くさいし、受け渡す値が増えたときにまたputExtraを追加とか面倒だなと思ってた。

思ってたので、調べてみた。Intent | Android Developersを見て、SerializableもputExtraはできることがわかる。
public Intent putExtra (String name, Serializable value) 

上の例を直してみる。まずNovelをSerializableをimplementsしてやる。受け渡すところは下記のように。
        Intent intent = new Intent(this, NextAct.class);
        intent.putExtra("NOVEL", novel);
で、受けとるときにはgetSerializableExtraの返りをキャストしてやる。
        Intent intent = getIntent();
        Novel novel = (Novel) intent.getSerializableExtra("NOVEL");
        title = novel.getTitle();
        desc = novel.getDesc();
        price = novel.getPrice();
オブジェクトのまま渡してるので、渡す側のコードがすっきり。これで同じ挙動。

画面遷移後に必要のない値をたくさん持っているクラスならば、オブジェクトを渡すよりは必要な項目選んで渡す方が良いとかあるだろうし、使い分けた方が良さそう。とりあえず選択肢は増えました。


せっかくなのでメモリの使用量も比較してみようと思って、Debug.getNativeHeapAllocatedSize()を使って比較したのだが信憑性に欠けるのでデータなどは割愛。結果はほとんど変わらなかったが、リストで選択するものによっては優劣が逆転してるので何かのミスや勘違いがありそうなので。。


Parcelabelってのもputできるようなので、これもまたの機会に見てみる。
public Intent putExtra (String name, Parcelable value)