2013年9月10日火曜日

【Android】カスタムビューのカスタムオプションの値が取れない場合

まずは小生の整理のためにも軽くまとめ.

Androidでもカスタムビューを作ることができる.
Viewや,TextView,LinearLayoutを継承すればいい.
たとえばRelativeLayoutを継承し,
その中に画像とテキストとチェックボックスを含め
単一のビューにする,などといったことができる.


作成したビューはレイアウトxmlに配置することができ,
グラフィカルレイアウトの画面でどのように配置されたかを
プレビューすることもできる.
配置には普段は
<TextView />や<LinearLayout >...</LinearLayout>
とするところを,
例えばパッケージ「com.example.test」のカスタムビュー「CustomView」の場合
<com.example.test.CustomView />や
<com.example.test.CustomView>...</com.example.test.CustomView>
のようにして使う.

また,独自のオプションを作成することができる.
オプションというのはレイアウトファイルでよく使う
android:layout_width
みたいなやつで,
先の例でいうと,
チェックボックスを表示・非表示にする checkvisibility(仮) とか,
画像をグレースケール化する imagegray(仮) とか
自分の用途に応じていろいろなオプションを考えられる.

このオプションは
res/values/attrs.xml
内に記述する.
オプションは記述しただけではまだレイアウトファイルに使用できず,
xmlns:custom="http://schemas.android.com/apk/res/com.example.test"
(customという文字列は別になんでもいい)
といった記述をレイアウトファイルのルートレイアウト内にしなければいけない.
同じタグ内に
xmlns:android="http://schemas.android.com/apk/res/android"
というものがあるはずである.
SDKのオプションについて同じことをやってくれている.

そうすることで,
<com.example.test.CustomView
custom:checkvisibility="visible"
custom:imagegray="false" />
といった感じでオプションが使用できる.

オプションの値はカスタムビュークラス内で
TypedArrayのオブジェクトを使うことで得ることができる.

かなり端折ったがここから本題.


この一連の過程を行ったときに,
エラーも出ていないのに
eclipseのグラフィカルレイアウトでオプションの値が反映されない場合がある.
そういった場合の対処法としてはeclipseを再起動する.これ.
ちなみにプロジェクトのクリーンを行っても解決されない.
eclipseを再起動すること.

この現象が起こるキーはres/layout/attrs.xmlの編集である.
オプションを追加したり,削除したりでattrs.xmlを編集したなら,
eclipseを再起動することでグラフィカルレイアウトに反映することができる.

カスタムビューを作るにあたって,
SDKの各Viewがそうであるように,
コンストラクタ,onMeasure,onLayoutからの流れで完結するような
作りにしたほうが望ましい.
つまりレイアウトに配置したあとでソースコード側(Java側)から必要なお作法が無い
こういった作りが望ましいと思う.
これはSDKのViewのソースコードが本当に参考になる.
/frameworks/base/core/java/android/widget
下のクラスがそれである.

0 件のコメント:

コメントを投稿