widgets

Widgetの見た目を変更する方法の話。

resourceのlayoutのXMLに記述するViewのElementには、既存のクラスを継承したクラスの名前を書いたらそれが使えるようになる。だけど見た目を変更する為だけに色々なWidgetを継承したクラスをたくさん作りたくは無い。出来ればHTMLのCSSみたいに一括で変更を適用したい。

layoutのXMLのelementの属性を一括で変更する方法としてstyleやthemeがある。ただこれだと標準で用意されているViewの属性指定だけでは見た目を思うように変更出来ない場合があるんじゃないかと思う。

elementのandroid:background 属性にresource中の画像ファイルやXMLファイルを指定する事が出来るので、その方法でも見た目を変更する事が出来る。drawableのXMLファイルの中身を解釈する処理は、android.graphics.Drawable.createFromXmlInner に記述されていて、予め限定された要素しか中に記述する事が出来ない処理になっている。出来ればBitmapDrawableを継承したClassを記述して属性の値に応じて描画内容を変更したりしたかったんだけれど…。

属性

http://developer.android.com/intl/ja/reference/android/view/LayoutInflater.html

LayoutのXMLファイルは処理能力の関係でコンパイルされたものを使っていると
上のURLに書かれているので、多分好き勝手な属性をLayoutのXMLファイルに書いても読み取る事は出来無さそう。

http://blog.pocketjourney.com/2008/05/02/android-tutorial-42-passing-custom-variables-via-xml-resource-files/
を見てみると既存のComponentを継承して新しいComponentを作って、attrs.xml にその型用の属性を追加する方式を取っている。

WEBで使われているCSSとは違って、androidのlayoutのstyleやthemeはelementの属性を変更するもので、elementの属性は型毎に使えるものが決まっているので、layoutのXMLやstyles.xmlにちょこちょこ指定して、後は用意したプログラムが一括で属性に応じて見た目を変更!っていうのは出来なさそうだ。。

独自に記述したXMLファイルをresourceのrawに入れて、プログラムでそれを読み取って動的に、ViewのsetBackgroundDrawableを呼び出してDrawableを継承した独自の型のinstanceを設定したら見た目をある程度好きに出来るだろう。

まぁアプリケーションの外観を実行時に変更しなくても、そのソフトウェアを使えないわけでは決して無いのだし、携帯端末のハードウェアとその上で動作するソフトウェアがもっと豪華になってから、富豪的なアプローチを取るべきって事なんだろうか…。