Androidでカスタムコンポーネントを作成する場合、attrsプロパティを作成してコンストラクターに渡す方法がよく聞かれます。
Javaでコンポーネントを作成するときは、単にデフォルトのコンストラクターを使用することをお勧めします。
new MyComponent(context);
xmlベースのカスタムコンポーネントでよく見られるオーバーロードされたコンストラクターにパススルーするattrsオブジェクトを作成するのではなく。私はattrsオブジェクトを作成しようとしましたが、それは簡単ではないか、まったく不可能に思えます(非常に複雑なプロセスなし)。
私の質問は次のとおりです。XMLを使用してコンポーネントを拡張するときにattrsオブジェクトによって設定されるプロパティを渡すまたは設定するJavaでカスタムコンポーネントを構築する最も効率的な方法は何ですか?
(完全開示:この質問は、 カスタムビューの作成 )の派生物です
必要な属性を追加するView
から継承された3つの標準コンストラクターを超えてコンストラクターを作成できます...
MyComponent(Context context, String foo)
{
super(context);
// Do something with foo
}
...しかし、私はお勧めしません。他のコンポーネントと同じ規則に従うことをお勧めします。これにより、コンポーネントができるだけ柔軟になり、コンポーネントを使用している開発者が他のすべてと矛盾するため、コンポーネントを使用する開発者が髪を引き裂くのを防ぎます。
1。各属性にゲッターとセッターを提供します:
public void setFoo(String new_foo) { ... }
public String getFoo() { ... }
2。属性をres/values/attrs.xml
で定義して、XMLで使用できるようにします。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyComponent">
<attr name="foo" format="string" />
</declare-styleable>
</resources>
3。 View
から3つの標準コンストラクターを提供します。
AttributeSet
をとるコンストラクターのいずれかの属性から何かを選択する必要がある場合は、次のことができます...
TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MyComponent);
CharSequence foo_cs = arr.getString(R.styleable.MyComponent_foo);
if (foo_cs != null) {
// Do something with foo_cs.toString()
}
arr.recycle(); // Do this when done.
すべて完了したら、プログラムでMyCompnent
をインスタンス化できます...
MyComponent c = new MyComponent(context);
c.setFoo("Bar");
...またはXML経由:
<!-- res/layout/MyActivity.xml -->
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:blrfl="http://schemas.Android.com/apk/res-auto"
...etc...
>
<com.blrfl.MyComponent
Android:id="@+id/customid"
Android:layout_weight="1"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_gravity="center"
blrfl:foo="bar"
blrfl:quux="bletch"
/>
</LinearLayout>
追加リソース- https://developer.Android.com/training/custom-views/create-view