[Android] カスタムビューのプロパティを xml から操作する

2016.02.12

XML で属性追加

カスタムビューを作成した時に、値を layout の xml からセットする方法をご紹介します。

カスタムビュークラスの作成

まずはカスタムクラスを作成します。 今回は View クラスのサブクラスとして作成しました。

/**
* ライトセーバーを表すビュークラス
*/
public class LightSaberView extends View {

public LightSaberView(Context context, AttributeSet attrs) {
super(context, attrs);
}
}

コンストラクタを 1 つ記述します。 こちらは Layout から生成されるときに呼ばれるものらしく、記述しなければエラーになります。

属性の定義

次に res/values/attrs.xml を作成し、以下のようにカスタムしたい属性を定義します。

<br /><br /><br /><br /><br /><br /><br /><br /><br />

declare-styleablename 部分が作成したカスタムクラス名となっており、attrname は属性名、format が型となっています。

ここでは isMaceWindu という boolean と、force という enum の属性を追加しました。

layout xml での値セット

以上の設定を行うと layout の xml から、作成した属性に対して値をセットすることができるようになります。

<br />

値の受け取り

次にカスタムビューの方で xml からセットした値を受け取ります。

private boolean isMaceWindu;

private int mForce;

public LightSaberView(Context context, AttributeSet attrs) {
super(context, attrs);

TypedArray a = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.LightSaberView,
0, 0);

try {
isMaceWindu = a.getBoolean(R.styleable.LightSaberView_isMaceWindu, false);
mForce = a.getInteger(R.styleable.LightSaberView_force, 0);
} finally {
a.recycle();
}

setBackgroundColor();
}

obtainStyledAttributes() というメソッドで TypedArray クラスのインスタンスを取得し、そのインスタンスから目的の値を取り出しています。 TypedArray のインスタンスに対する処理が全て終わったら recycle() メソッドを忘れずに実行しましょう。

ここでは取得した値によってビューの背景色を変えるという処理を行いました。

private void setBackgroundColor() {
int color = Color.WHITE;

if (isMaceWindu) {
color = Color.MAGENTA;
} else if (mForce == 0) {
color = Color.BLUE;
} else if (mForce == 1) {
color = Color.RED;
}

this.setBackgroundColor(color);
}

実行

app:isMaceWindu="true"

1


app:force="light_side"

2


app:force="dark_side"

3

リンク

ミレニアム・ファルコン製作日記 #4

4 号 表紙

mfd_4_1

パーツ

mfd_4_2

mfd_4_3

成果

mfd_4_4

mfd_4_5

今回の作業は以下の 3 つでした。

  • コクピット基部パネルを仮組みする
  • 外殻フレームの組み立て 2
  • 装甲プレートの取り付け 1

コクピットに関しては内装部品を前方に取り付けただけでした。 今のところコクピットに関してはうまく行っています。 ハン・ソロとチューバッカのフィギュアが欲しくなってきますね。 レゴの人形でも座らせようかな。

外殻フレームの組み立ては結構苦戦しました。 以前組み立てたものにフレームを追加する作業でしたが、ほんの少しだけネジ穴がズレていたりしたので、全てのネジをパーフェクトに収めることができませんでした。 ですが、それなりにかみ合わさっていて簡単には外れなさそうなので良しとしましょう。

フレームを組み立てた後は、そのフレームに対して装甲プレートを取り付けました。 今回取り付けたパーツは創刊号で提供された装甲プレートとなります。 今後このような形でフレームと装甲プレートを少しずつ取り付けていくことになると思います。

成果物が徐々に大きくなってきて、パーツの置き場に困ってきました。 そのうち収納ケースを買ってこようと思います。

それではまた次回。

May the Force be with you!