Androidカスタムコントロールでプロパティを取得する3つの方法(回転)
10393 ワード
第1の方法は、attrsを介して属性値を直接設定する.getAttributeResourceValueはこの属性値を取得します.
(1)xmlファイルでの属性値の設定
(2)コンストラクション関数でこの値を取得する
2つ目の方法は、自分のネーミングスペースを使用することです.
(1)xmlファイルでは、http://t+というVIEWのパッケージ名の形式でネーミングスペースを宣言する必要があることに注意してください.
(2)attrsを通過する.getAttributeResourceValue、最初のパラメータはネーミングスペースです.
//ネーミングスペースprivate final String namespace = "http://com.example.activity"
3つ目の方法はattrsをカスタマイズすることです.xmlで実現
(1)attrsをカスタマイズする.xmlファイル
(2)xmlファイルでこの属性を使用し,このときのネーミングスペースの書き方に注意する.
(3)コードにcontextを用いる.obtainStyledAttributes取得属性値
(1)xmlファイルでの属性値の設定
<com.example.activity.IconTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/smile1"
iconSrc="@drawable/smile"/>
(2)コンストラクション関数でこの値を取得する
public IconTextView(Context context, AttributeSet attrs) {
super(context, attrs);
resourceID = attrs.getAttributeResourceValue(null, "iconSrc", 0);
if(resourceID > 0) {
bitmap = BitmapFactory.decodeResource(getResources(), resourceID);
}
}
2つ目の方法は、自分のネーミングスペースを使用することです.
(1)xmlファイルでは、http://t+というVIEWのパッケージ名の形式でネーミングスペースを宣言する必要があることに注意してください.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:mobile="http://com.example.activity"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.example.activity.IconTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/smile1"
mobile:iconSrc="@drawable/smile"/>
LinearLayout>
(2)attrsを通過する.getAttributeResourceValue、最初のパラメータはネーミングスペースです.
//ネーミングスペースprivate final String namespace = "http://com.example.activity"
public IconTextView(Context context, AttributeSet attrs) {
super(context, attrs);
resourceID = attrs.getAttributeResourceValue(namespace, "iconSrc", 0);
// TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.IconTextView);
// resourceID = array.getResourceId(R.styleable.IconTextView_iconSrc, 0);
if(resourceID > 0) {
bitmap = BitmapFactory.decodeResource(getResources(), resourceID);
}
}
3つ目の方法はattrsをカスタマイズすることです.xmlで実現
(1)attrsをカスタマイズする.xmlファイル
xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="IconTextView">
<attr name="iconSrc" format="reference"/>
declare-styleable>
resources>
(2)xmlファイルでこの属性を使用し,このときのネーミングスペースの書き方に注意する.
xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:mobile="http://schemas.android.com/apk/res/com.example.activity"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.example.activity.IconTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/smile1"
mobile:iconSrc="@drawable/smile"/>
<com.example.activity.IconTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/smile2"
android:textSize="24dp"
mobile:iconSrc="@drawable/smile"/>
<com.example.activity.IconTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/smile3"
android:textSize="36dp"
mobile:iconSrc="@drawable/smile"/>
LinearLayout>
(3)コードにcontextを用いる.obtainStyledAttributes取得属性値
package com.example.activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.TextView;
public class IconTextView extends TextView {
//
private final String namespace = "http://com.example.activity";
// ID
private int resourceID = 0;
private Bitmap bitmap;
public IconTextView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.IconTextView);
resourceID = array.getResourceId(R.styleable.IconTextView_iconSrc, 0);
if(resourceID > 0) {
bitmap = BitmapFactory.decodeResource(getResources(), resourceID);
}
}
@Override
public void onDraw(Canvas canvas) {
if (bitmap != null) {
Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
Rect target = new Rect();
int textHeight = (int)getTextSize();
target.left = 0;
target.top =(int)(getMeasuredHeight() - getTextSize()) / 2 + 1;
target.bottom = target.top + textHeight;
target.right = (int)(textHeight * (bitmap.getWidth() / (float)bitmap.getHeight()));
canvas.drawBitmap(bitmap, src, target, getPaint());
canvas.translate(target.right + 2, 0);
}
super.onDraw(canvas);
}
}