11/23/2011

Android覚書

どうもJudaです。
Androidについてあれこれ。
  • layoutファイルはlayout*/*に配置される。
  • layoutファイルでのandroid:*は、xmlnsで定義されているから利用できる。
  • xmlnsを新しく定義すれば、別の区切りを使えるようになる。しかしEclipseでの入力補助はうまく効かなくなる。
  • 別ファイルに別のlayoutを作成できる。
  • 別ファイルに定義したlayoutは、で呼び出せる。
  • プログラムから呼び出す場合には、LayoutInflaterを利用する。AndroidのVersionによって呼び出し方が異なるので、要注意。
  • mergeをrootにもつlayoutは、基本的にはLayoutInfalterからLayoutを呼び出し、親要素に対してアタッチすることが必要になる。
  • またmergeでアタッチする場合に、親要素はFrameLayoutなどの一部のViewGroupの派生系に限られる。
  • merge機構を利用して、構築済みのレイアウトを使うカスタムViewコンポーネントを作成できる。
  • mergeする場合には、親要素とは継承したクラスのことになることが多いので、FrameLayoutなどを継承することで処理を簡略化できる。
  • inflateしてアタッチした場合はidなどの設定がずれることがあるので、LayoutInflaterのinflateメソッドの戻り値に対して、findViewByIdなどを使うことが必要になる。
  • onLayoutは、親から呼ばれ、表示可能領域が親要素からの相対的な引数で与えられる。
  • ViewGroupの系列にあるクラスコンポーネントを開発する場合には、onLayoutやonMeasureを実装することが、必然的に必要になってくる。あとはaddViewの実装を操作するとXMLでのLayoutで子要素を書く数を変えられる。
  • onLayoutでは、子要素をレイアウトすることが趣旨である。
  • onLayoutで呼び出す子要素は自身からの相対位置で子要素に対して通知する。その後の配置と描画はここのViewに依存する。MerginやPaddingの取り扱いについては、不定。
  • onMeasureは自分自身のサイズと子要素をもつ場合には、子要素が確保できるサイズに関して通知をする。はず。。。
  • onMeasureでは複数のモードを確認する必要性がある。EXACTRY,AT MOST,UNSPECIFIEDがある。
  • Androidではインスタンスの生成はとてもリソースを必要とする。またLayoutInflaterは更に多くのリソースを必要とする。XMLのパーサが重いらしい。
  • AndroidではViewの作成が重いため、ListViewとAdapterViewの組み合わせでは、利用したViewを再利用する機構を採用している。
  • ListViewでは、Scrollによって表示内容が変更された場合に、表示しているViewを減らしたり増やしたりをしている。減らす際に、ViewをRecycleBinに入れておき、なるべく再利用する。またViewの種類が幾つかある場合には、RecycleBinを増やし、種類を識別して対応している。
  • ListViewやScrollViewはaddChildの利用を制限してる。
  • 独自のクラスを作成し、属性を増やす場合には、value/attrsで記述する。基本的な動作はAndroidのソースコードを参考にすることがよい。またEclipseではattrs.xmlの記述をサポートしてもらえないので、よりソースコードを参考にする必要が出てくる。
  • ListViewはAbsListViewを継承して作成されているが、あくまでVerticalな動作のみを期待しているので、HorizontalなListViewの実装はAdaperViewなどから実装する必要があり、動作の速度をあげるために、前述のRecycleをする機構を組み込む必要がある。この機構で重要なのは、onLayoutで表示しなくなる要素の確認と、表示しなくなったところを復元するために再度Viewを増やすこと、そしてスクロールオフセットを考慮して、子要素を配置することである。
  • Scrollerを利用すると、スクローリングやフリックなどの処理を代行させられる。ただし痒いところに手が届かない場合には、再実装が必要になる。
  • GestureDetector.SimpleOnGestureクラスの実装は痒いところに手がとどかないので、実装内容を確認して、別の実装を組み立てることがより細かな設定を行なっていく上で必要になる。
  • onDrawを利用することを考えるならば、Drawableの利用を考慮することを推奨する。またsetBackgroundとの兼ね合いが問題にならないように注意したい。
  • AdapterViewでinflateしてEventを作る場合には、特定のイベントで内容を更新する場合には、そのイベントリスナーに登録する実装はAdapterViewに配置しておかないとうまくnotifyを呼び出せなくなる。
  • 上記のような実装は、階層性を持ったカスタムコンポーネントにそれぞれの処理を実装させてしまうと発生する。(個人の設計ミスであるとは思うが、テストなどをしながら開発しているとよく起こると思う。)
  • ListViewへのrequestLayoutは子要素のonLayoutの呼び出しを保証しないので、子要素が変化する場合には、子要素自身のrootへrequestLayoutが流れることが必要になる。