前回こんな記事を書きました。

【Android】AttributeSetを使ってXMLだけで自作Viewに値をセットする

ここでres/values/attr.xmlを用意して、自作Viewにユーザーさんに設定してほしい値を名前空間を用意してセットしてもらう方法を紹介しました。

しかし、まだまだ.aarのファイルって世に広まっていない印象があったり、AndroidのResourceファイルの置き場であるresディレクトリを作るのがもったいないということだったりで、まだまだ.jarファイルを用意してライブラリを提供するのが多いかと思います。

ちなみにAdMaxSDKAdMaxSDK-1.1.2.jarというファイルで提供しています。

他者さんのSDK(すべてを調べたわけではありませんが、巷で有名な会社のSDK)も.jarファイルで提供しています。

ということで、今回は.jarファイルで自作Viewを提供したときのLayoutファイルからの値の取得方法を紹介したいと思います。

サンプルの紹介

サンプルは上の記事の時に使ったやつを使います。

.aarファイルを提供したときと、.jarファイルを提供したときとでの違いを紹介します。

レイアウトファイル

ちなみにres/values/attr.xmlファイルは以下のようになっています。

res/values/attr.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomView">
<attr name="custom_circle_x" format="dimension|reference" />
<attr name="custom_circle_y" format="dimension|reference" />
<attr name="custom_circle_position">
<enum name="top" value="0" />
<enum name="bottom" value="1"/>
<enum name="left" value="2" />
<enum name="right" value="3" />
<enum name="center" value="4"/>
<enum name="top_left" value="5" />
<enum name="top_right" value="6" />
<enum name="bottom_left" value="7" />
<enum name="bottom_right" value="8" />
</attr>
<attr name="custom_circle_radius" format="dimension|reference" />
<attr name="custom_circle_color" format="color|reference" />
</declare-styleable>
</resources>
  • custom_circle_x : 描画する円のX座標
  • custom_circle_y : 描画する円のY座標
  • custom_circle_radius : 描画する円の半径
  • custom_circle_color : 描画する円の色
  • custom_circle_position : 相対的な円の位置

という値を設定してもらいたいとします。

attr.xmlを用意した場合のレイアウトファイル

まずはres/values/attr.xmlを使った場合の設定方法は以下のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:customView="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<jp.shinobi.admax.android.sampleattributeset.views.CustomView
android:layout_width="match_parent"
android:layout_height="match_parent"
customView:custom_circle_x="100dp"
customView:custom_circle_y="100dp"
customView:custom_circle_radius="100dp"
customView:custom_circle_color="#0000FF"
/>
</RelativeLayout>

無駄な値(今回の記事に必要ない値)は削除しました。

まあ名前空間を用意すれば、とっても見やすいコードになります。

attr.xmlを用意していない場合のレイアウトファイル

では名前空間を使わない場合の値の設定方法です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<jp.shinobi.admax.android.sampleattributeset.views.CustomView
android:layout_width="match_parent"
android:layout_height="match_parent"
custom_circle_x="100dp"
custom_circle_y="100dp"
custom_circle_radius="100dp"
custom_circle_color="#0000FF"
/>
</RelativeLayout>

となります。

単純に名前空間を削除しただけとなります。

では上記の様にした場合の値の取得方法を紹介します。

レイアウトファイルから設定してもらった値を取得する

まずは名前空間を用意した場合の取得方法を復習した後に、名前空間がない値を取得する方法を紹介したいと思います。

attr.xmlを用意した場合の値の取得方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static final float DEFAULT_CIRCLE_X = 100.0f;
private static final float DEFAULT_CIRCLE_Y = 100.0f;
private static final float DEFAULT_CIRCLE_RADIUS = 100.0f;
private static final int DEFAULT_CIRCLE_POSITION = 999;
private static final int DEFAULT_CIRCLE_COLOR = Color.argb(255, 0, 0, 0);
public CustomView(Context context, AttributeSet attrs) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
int customCircleColor = typedArray.getColor(R.styleable.CustomView_custom_circle_color, DEFAULT_CIRCLE_COLOR);
float customCircleX = typedArray.getDimension(R.styleable.CustomView_custom_circle_x, DEFAULT_CIRCLE_X);
float customCircleY = typedArray.getDimension(R.styleable.CustomView_custom_circle_y, DEFAULT_CIRCLE_Y);
float customCircleRadius = typedArray.getDimension(R.styleable.CustomView_custom_circle_radius, DEFAULT_CIRCLE_RADIUS);
int customCirclePosition = typedArray.getInt(R.styleable.CustomView_custom_circle_position, DEFAULT_CIRCLE_POSITION);
typedArray.recycle();
}

と上記のように取得します。

特徴としてはTypedArrayを一度呼び出しているところでしょうか。

一つ一つのメソッドに関しての説明は割愛させて頂きます。

次に名前空間がないときの値の取得方法を紹介します。

attr.xmlを用意していない場合の値の取得方法

以下のように取得します。

1
2
3
4
5
6
7
8
9
10
11
12
private static final float DEFAULT_CIRCLE_X = 100.0f;
private static final float DEFAULT_CIRCLE_Y = 100.0f;
private static final float DEFAULT_CIRCLE_RADIUS = 100.0f;
private static final int DEFAULT_CIRCLE_POSITION = 999;
private static final int DEFAULT_CIRCLE_COLOR = Color.argb(255, 0, 0, 0);
public CustomView(Context context, AttributeSet attrs) {
int customCircleColor = attrs.getAttributeIntValue(null, "custom_circle_color", DEFAULT_CIRCLE_COLOR);
float customCircleX = attrs.getAttributeFloatValue(null, "custom_circle_x", DEFAULT_CIRCLE_X);
float customCircleY = attrs.getAttributeFloatValue(null, "custom_circle_y", DEFAULT_CIRCLE_Y);
float customCircleRadius = attrs.getAttributeFloatValue(null, "custom_circle_radius", DEFAULT_CIRCLE_RADIUS);
int customCirclePosition = attrs.getAttributeIntValue(null, "custom_circle_position", DEFAULT_CIRCLE_POSITION);
}

という方法で取得します。

ちょっと一つ一つのメソッドが長くて不格好ですね…。

ちなみに他のメソッドは公式リファレンスを見て確認してください。

AttributeSet | Android Developers

attr.xmlを用意するかどうか

僕が両方使った印象がだいぶありますが、比べてどっちが良いのってお話をしたいと思います。

attr.xmlを用意したときと用意していない時を比べて

箇条書きで挙げたいと思います。

  • attr.xmlを用意した方がLayoutファイルの時に任意の値を入力してもらった時に型チェックが入って、違う場合エラーが出力されてビルドできない
  • attr.xmlを用意していない状態でLayoutファイルに値を入力すると、エラーは出ないがAlertが出続ける
  • attr.xmlを用意しない方が.jarファイルをlibsディレクトリに保存するだけなので、導入が楽

ぐらいですかね。

attr.xmlを用意しないと正直どんな値(型)を渡されるかは実行されるまでわからないので、より正確な値が欲しい場合はちょっとめんどくさくなります。

ファイル容量

ちなみにファイル容量は以下のようになります。

1
2
$ ls -lah custom-view-0.0.1.aar
-rw-r--r-- 1 hoge fuga 6.0K 9 30 14:43 custom-view-0.0.1.aar

では.jarファイルはどれくらいかというお話ですが、.jarファイルに関しては以下の記事を参考にしてください。

【Android】AndroidStudioでjarを出力する

この記事でも書いた通り、.jarファイルはbuild/intermediates/bundles/release/classes.jarにあります。

これの容量はというと…

1
2
ls -lha build/intermediates/bundles/release/classes.jar
-rw-r--r-- 1 hoge fuga 5.8K 9 30 14:43 build/intermediates/bundles/release/classes.jar

ということで、そこまで容量は変わりません。

画像を用意するなら別ですが、attr.xmlを用意するぐらいなら.aarファイルを配布する方が、自作Viewを作成したユーザーさんもこれを使うユーザーさんも幸せになれるのかなという感じです。

ということで、自作Viewを公開するときは.aarファイルを配布するようにしましょう。

終わりに

ということで、.aarファイルを侮っていました。

.aarファイルに関してそろそろ記事をしっかり書かなきゃなと思いました。

※ 2014-10-06(月)に記事書きました。

【Android】AndroidLibrary作成時に生成される.aarについて

以上になります。

参考

AttributeSet | Android Developers