1. ホーム
  2. android

[解決済み] カスタム属性(attrs)の定義

2022-03-20 20:40:53

質問

のような独自の属性を実装する必要があります。 com.android.R.attr

公式のドキュメントには何も書かれていないので、これらの attrs をどのように定義し、私のコードからどのように使用するかについての情報が必要です。

どのように解決するのですか?

現在、最も優れたドキュメントはソースです。それを見ることができます こちら (attrs.xml) .

属性を定義するには、一番上の <resources> 要素の中、または <declare-styleable> 要素を使用します。もし、あるattrを複数の場所で使用するのであれば、ルート要素に入れます。なお、すべての属性は同じグローバルな名前空間を共有している。つまり、たとえ新しい属性を <declare-styleable> 要素の外側で使用することができ、同じ名前で別の型の属性を作成することはできません。

を使用します。 <attr> 要素には2つのxml属性があります。 nameformat . name を使えば、何かを呼び出すことができ、これがコードでそれを参照することになるのです。 R.attr.my_attribute . その format 属性は、必要な属性の「タイプ」によって異なる値を持つことができます。

  • 参照 - 他のリソースIDを参照している場合(例:"@color/my_color"、"@layout/my_layout")。
  • ブーリアン
  • 次元
  • フロート
  • 整数
  • 文字列
  • 分数
  • enum - 通常は暗黙的に定義されます。
  • フラグ - 通常は暗黙的に定義されます。

を使用することで、複数の種類にフォーマットを設定することができます。 | , 例, format="reference|color" .

enum 属性は、以下のように定義できる。

<attr name="my_enum_attr">
  <enum name="value1" value="1" />
  <enum name="value2" value="2" />
</attr>

flag 属性は、値を定義して一緒にビット化できるようにする必要があることを除いて、似ています。

<attr name="my_flag_attr">
  <flag name="fuzzy" value="0x01" />
  <flag name="cold" value="0x02" />
</attr>

属性の他に <declare-styleable> 要素を使用します。これにより、カスタムビューが使用できる属性を定義することができます。これを行うには <attr> 要素を指定する必要があります。 format . androidのattr、例えばandroid:gravityを再利用したい場合は、android:gravityの中にある name は、以下のようになります。

カスタムビューの例 <declare-styleable> :

<declare-styleable name="MyCustomView">
  <attr name="my_custom_attribute" />
  <attr name="android:gravity" />
</declare-styleable>

カスタムビューにXMLでカスタム属性を定義する場合、いくつかのことを行う必要があります。最初に、属性を見つけるための名前空間を宣言する必要があります。これは、ルート・レイアウト要素で行います。通常、ルート・レイアウト要素には xmlns:android="http://schemas.android.com/apk/res/android" . ここで、さらに xmlns:whatever="http://schemas.android.com/apk/res-auto" .

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:whatever="http://schemas.android.com/apk/res-auto"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

    <org.example.mypackage.MyCustomView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:gravity="center"
      whatever:my_custom_attribute="Hello, world!" />
</LinearLayout>

最後に、そのカスタム属性にアクセスするには、通常、以下のようにカスタムビューのコンストラクタで行います。

public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);

  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyle, 0);

  String str = a.getString(R.styleable.MyCustomView_my_custom_attribute);

  //do something with str

  a.recycle();
}

終わりです :)