2011年02月25日

[Android] 縦横切り替えとインスタンスの再生成

以前から疑問だったことがありました。
縦向き画面のときと、横向き画面のときでレイアウトを変えたい場合どのようにしたら良いのだろう?と。

当時考えた方法は、とりあえず以下の4点でした。

◆configChangesを無指定にして、Activityが再生成されるようにする場合
1. layout-port、layout-land にxmlを置く。毎回Activityが破棄されるので、それでも問題ない作りにする。

◆configChangesに縦横切り替えをしていしてActivityが再生成されないようにする場合
2. 基本のレイアウトをlayout.xmlで記述する。差異のある部分だけプログラムから変更する。
3. layout-port、layout-land にxmlを置く。切り替え時点でsetContentViewを呼び、Viewのインスタンスだけ再生成させる。
4. 全部プログラムでViewを構築する。

1の場合、縦横を切り換えるだけで、onCreate()〜onDestroy()まで行われるため、もろもろのオブジェクトまで破棄〜再生成せねばならず、あまり良い方法には思えませんでした。
通信によって取得した場合も、どこかに保存するような処理を書かねば、縦横切り替えの度に通信が必要になってしまいます。

2の場合ですが、現状この方法で実装しているアプリがあります。
縦横切替のタイミングで呼ばれるメソッド(onConfigrationChanged())で、縦の場合、横の場合と分岐させてレイアウトを変えています。
ただ、setContentView()などを呼ぶとViewのインスタンスが再生成されてしまうので、それらは呼んでいません。
ViewGroupに対してaddView,removeViewなどして、せっせとレイアウトを変えています。
実際にやってみると(やらなくても?)わかるのですが、これはかなりイケていません。
レイアウトを定義している部分がxmlにもプログラムにもあり、どこを直したら良いのかわからなくなります。
もうこの案は二度と採用しないでしょう。

3の場合ですが、ちょっとこれは採用できませんでした。
今考えれば2よりはるかにマシかと思うのですが、2を採用したのは「改修」のタイミングですでに基盤があったのです。
データをViewそのものが持っているような構造になっていたため、Viewのインスタンスを再生成した場合に再描画するためのコードを書くのが恐ろしく面倒でした。

4の場合、これは面倒すぎてすぐに却下しました。


さて、今ならどれを採用するか。
ついこの間までは「やはり3かなぁ」と考えていましたが、最近見つけた以下の記事で考えを改めました。

http://developer.android.com/intl/ja/resources/articles/faster-screen-orientation-change.html

ここにはActivityが破棄されても、必要なインスタンスを持ち続ける方法が書かれていました。
Androidの正統派の作り方はこれなんじゃないかと思いました。
やっていることは簡単で、onRetainNonConfigurationInstance()をオーバーライドして、持ち続けたいインスタンうを返すだけです。
そのインスタンスを使うとき(onCreateだと思います)は、getLastNonConfigurationInstance()を呼ぶだけです。
これだけでわざわざインスタンスの再生成で悩んだり、Singletonオブジェクトを作ったりする必要が無くなると思いました。

詳しくは上の記事を読んでみてください。
他にも同様に役に立つ記事が多数あるようなので、読みたいと思います。

一応、自分でもサンプルコードを書いてみました。
よろしかったらご確認ください。
RotateTest.zip
タグ:android
posted by t2low at 12:05| Android

2011年02月15日

[Android] android_winusb.inf に追記する内容

新しいAndroid端末をWindowsにつなごうとすると、うまく認識しないことがあります。
そんなとき、android_winusb.inf になんだかよくわからない文字列を追記するだけで認識するようになることがあります。

; XXX XXXX
%SingleAdbInterface% = USB_Install, USB\VID_XXXX&PID_XXXX
%CompositeAdbInterface% = USB_Install, USB\VID_XXXX&PID_XXXX&MI_XX

こんな形式なやつです。
前々から不思議だったのです。
これに書く内容はどこで調べてくるんだろう、と。

で、今日ネットをいろいろ調べていたら、わかったのです。
(わかったと言っても人のブログを見ただけなんですけども)
ただ、完全に理解したわけでなくて、なんとなくそうっぽいという理解です。

それは「デバイスマネージャを見る!」でした。
デバイスマネージャからAndroid端末(ちゃんと認識してない「?」の状態でもだいじょぶ)を選んで、プロパティを開きます。
詳細タブを開いて、プロパティの欄をハードウェアIDに切り替えます。
すると、値の部分にそれっぽい文字列が!

property.png

USB\VID_0BB4&PID_0C87&REV_0226&MI_01
USB\VID_0BB4&PID_0C87&MI_01

これ↑を最初に書いた形式にするにはこれ↓をくっつければ良いのではないかと。

%SingleAdbInterface% = USB_Install,
%CompositeAdbInterface% = USB_Install,

一応、適当に連結したら認識するようになった端末もあるので、間違ってはないっぽい気もしますが、本当に合っているのかは自信がありません。
表示された値の順番は関係ないのかなぁ、とかVIDとかPIDとかREVとかMIとかってなんだろう、とか。
でも、昨日まではこの値がどこで調べられるのかも知らなかったわけで、一歩前進です。
また興味を持ったときに調べたいと思います。
タグ:android
posted by t2low at 01:58| Android