web-dev-qa-db-ja.com

Javaおよびxmlでカスタムコンポーネントパラメータを渡す方法

Androidでカスタムコンポーネントを作成する場合、attrsプロパティを作成してコンストラクターに渡す方法がよく聞かれます。

Javaでコンポーネントを作成するときは、単にデフォルトのコンストラクターを使用することをお勧めします。

new MyComponent(context);

xmlベースのカスタムコンポーネントでよく見られるオーバーロードされたコンストラクターにパススルーするattrsオブジェクトを作成するのではなく。私はattrsオブジェクトを作成しようとしましたが、それは簡単ではないか、まったく不可能に思えます(非常に複雑なプロセスなし)。

私の質問は次のとおりです。XMLを使用してコンポーネントを拡張するときにattrsオブジェクトによって設定されるプロパティを渡すまたは設定するJavaでカスタムコンポーネントを構築する最も効率的な方法は何ですか?

49
Emile

(完全開示:この質問は、 カスタムビューの作成 )の派生物です

必要な属性を追加する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

95
Blrfl