2012/12/09

通知のカスタムレイアウトでつぼる

通知のカスタムレイアウトに使用するViewの最初の要素をリソースで指定すると死ぬらしい。。。


#OKな例
#NGな例

そんなん知らんがな。。。(´・ω・`)

※※※
そもそも通知の高さをdpで指定している時点でNGな気がするけれど、match_parentだと表示がおかしくなる端末、OSがあったりして、やむを得ず。

2012/02/28

SparseArrayメモ

ADT17が間もなくリリースされるそうですが、Lint先生にパフォーマンスに関する項目が追加になるそう。
Floatでjava.lang.Mathの各メソッド使うのは無駄だからandroid.util.FloatMath使えとか、Map<Integer, E>は無駄だからSparseArray使えとか。

私自身FloatMathは知っていたけれどSparseArrayはListViewのマルチチョイスモードで選択位置の取得の返り値がSparseBooleanArrayってことくらいしか知らなかったので、SparseArrayについてのメモ。
注)大分適当です


Q. SparseArrayって何?
A. キーがintでListっぽくもMapっぽくも使える何か。

Q. どう使うの?
A. Map<Integer, E>をそのままSparseArrayに書き換えればおk。

Q. キー一覧や値一覧ってどうやって取得するの?
A. forループやwhileで回して頑張れ。


値がBooleanやIntegerの場合にはSparseBooleanArrayやSparseIntegerArrayが実装されているのでそっちを使おう。
あんまりJavaの内部のことを知らないのでintとIntegerがどれくらい違うのかが分からないのだけれど、Androidで利用する分にはパフォーマンスが上がるのでしょう。


SparseArrayは内部で
private int[] mKeys;
private Object[] mValues;
private int mSize;
を管理していて、SparseArray#putで中身を突っ込むとキーと値がそれぞれに格納される。Parcelに突っ込むときはParcel#writeSparseArrayってメソッドがあるのでそれを使うか、sizeとkey、valueをループ回して突っ込もう(Parcel#writeSpaseArrayの中身はループ回してるだけなので)。逆もしかり。


###
SparseArrayは日本語に訳すと疎な配列。それぞれの値に関連性が薄いんでしょう。

2012/01/28

PreferenceActivityで一個だけPreferenceFragmentを表示する

PreferenceFragmentに対してHeader等を利用せずに一個だけPreferenceFragmentを表示したいと思ったが、中々実現できなかったのでメモ的に。(見た目とか気にしなければ、普通のActivityにトランザクションしても表示できてしまうのかもしれないけど、やってないので分からない)


PreferenceActivityのメソッドを見てみるとstartPreferenceFragment(Fragment, boolean)なんてものがあるのでこれを利用すれば出来るのかなと思ったけれど、トランザクションするView見つかんねーぞ(゚Д゚)ゴルァって怒られる。

これの原因は
全てこいつが悪い。先のメソッドは
この通りただのトランザクションなのに
こんな互換性用のレイアウトを設定してしまうためにR.id.prefsというフラグメントトランザクション用のViewが消失。PreferenceActivityで自分でトランザクションを管理するにはこのViewへの切り替えを抑制する必要がある。



長々と理由を説明しつつ、PreferenceActivityはonCreateで最初に
を読み込むため、 これで1PreferenceActivity-1PreferenceFragmentが出来る。onIsMultiPaneかonIsHidingHeadersのどちらかを上書きしないとタブレット表示時にマルチペインになってしまうかも知れないので、予防的上書き。
ちなみにinitialTitleは画面タイトル(Phoneはタイトル部、TabletはFragment上部のタイトル部分の左)、initialShortTitleはTabletでFragment上部のタイトル部分の右に表示される用のStringリソースIDだとかなんとか。