2013/06/22

カスタム属性作成時の注意点

先日、自分のプロジェクトにdeclare-styleableを追加したらビルドが出来なくなったのでメモ的な。

環境:
IntelliJ 12.1.4、Android Studio 0.1.6
SDK 22.0.1、Build-tools 17

結論:
idリソースと重複する名前のdeclare-styleable > attr > enum (flag)を定義することは出来ない

具体的には、以下のように定義したidと同じ名前を持つenum、flagが定義できない。レイアウトXML等で『android:id="@+id/sample"』と設定している分には問題無いのだけれど。。。

↓コンパイルエラー

↓OK

2013/06/01

レイアウトxmlにViewの追加情報を仕込む

レイアウトxmlからViewを取得する時に、その取得対象が固定的な内容だったらFragmentに固定で書いても良いけれど、パースするxmlがコロコロ変わる場合はどのViewにどの情報を表示して良いか分からないよね!

→ xmlに仕込みを入れておけばいいじゃない!!(楽観視)


サンプル:TextViewに曜日情報を仕込んで、Activityから取得する。


こんなカスタム属性を用意しておけば、ViewのIDと日付を同時に取れます。


レイアウトxmlにこんな感じでカスタム属性を仕込みます。3行目は自分のアプリ名。namespaceのnxは「noxi」の略なので自分に合ったものに変えることをお勧めします。


android.view.LayoutInfleter$Factoryを実装したクラスを作ります。これを実装することで、xmlパースの処理をフックすることが出来ます。


LayoutInflater#fromでLayoutInflaterを取得し、setFactoryで今回作成したクラスをセットします。ちなみにLayoutInflater$Factory2とかあるらしいけど、違いは親のViewGroupが引数に入るかどうかとAPI11なこと。