=前置き=
ドット絵エディタの設計だけするつもりだったけど、やる気が出てきてしまったので少し作業することにした。ので、そのログ。
=XML内で接続=
以前は接続先とかはコード側で書いていたものの、今回はXML側で書いてみたいと思う。
既存のコンポーネントには接続先の設定などは用意されていないため、全てカスタムビューで用意する必要がある。(今回の方式の場合、ここらへんが面倒)
まず、カスタムコンポーネントにリンク先を指定できるように、以下のようなattrs.xmlをvaluesフォルダに作る。
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CustomPaletteButton"> <attr name="link" format="reference"/> </declare-styleable> </resources>
そして、以下のような感じでリンクを張る。(TextViewのidにリンクを張っている)
<TextView android:id="@+id/hoge" /> <showohealer.tool.doteditortile.widget.CustomPaletteButton app:link="@id/hoge" />
コード側では、まずコンストラクタに渡されるAttributeSetからリンク先のIDを得る。
if(attrs != null){ TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.CustomPaletteButton); m_LinkID = ta.getResourceId(R.styleable.CustomPaletteButton_link, 0); }else{ m_LinkID = 0; }
そして、必要になったらリンクIDから実際のViewを取得してあれこれする。(getRootViewから呼び出さないとnullになるので注意)
if(m_LinkID != 0){ TextView tv = (TextView) getRootView().findViewById(m_LinkID); //あれこれする }
=ラジオボタンのカスタマイズ=
今回はツールアイコンをラジオボタンの挙動で並べたい。ツールアイコンはボタンごとに画像が違い、ツールだけでも11個、流用するのも合わせると20個くらいになる。さすがにそれぞれにXMLを用意してstyleを指定していくのは面倒なので、ラジオボタンのカスタムViewを作り、「XMLで画像指定」「コードで切替」という風にしたい。「XMLで画像指定」は普通にカスタムViewにreferenceとして追加すれば良いので、ここではコードについてだけ書く。
コード側は自前でDrawを書く方法もあるが、ここではStateListDrawableを使うことにする。これは、XMLでstyleを指定するやつのコード版。なので、書き方も似ていて以下のように書ける。
{//背景画像にStateListDrawableを使い、状態に応じた画像を表示する StateListDrawable sld = new StateListDrawable(); sld.addState(new int[]{android.R.attr.state_checked}, getResources().getDrawable(m_ResID_Chk)); sld.addState(new int[]{ }, getResources().getDrawable(m_ResID_Nrm)); setBackgroundDrawable(sld); }
ラジオボタンをカスタマイズする場合、上の設定だけだと元のチェック画像が表示されるため、以下のようにして表示をオフにする。(もっと良い方法がありそうだが、普通にsetButtonDrawable(null)とするだけではダメだった)
{//元のチェック表示をオフにする StateListDrawable sld = new StateListDrawable(); sld.addState(new int[]{}, null); setButtonDrawable(sld); }