1. ホーム
  2. xml

[解決済み] XMLを用いたカスタムandroid UI要素の宣言

2022-03-20 16:21:58

質問

XMLを使用してAndroid UI要素を宣言するにはどうすればよいですか?

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

Android Developer Guide には、以下のようなセクションがあります。 カスタムコンポーネントの構築 . 残念ながら XML属性の議論 は、レイアウト・ファイル内でのコントロールの宣言のみをカバーし、クラスの初期化で実際に値を処理することはしません。手順は以下の通りです。

1. 属性を values\attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyCustomView">
        <attr name="android:text"/>
        <attr name="android:textColor"/>            
        <attr name="extraInformation" format="string" />
    </declare-styleable>
</resources>

で修飾されていない名前を使っていることに注意してください。 declare-styleable タグを使用します。のような非標準のアンドロイド属性は extraInformation は、その型を宣言する必要があります。スーパークラスで宣言されたタグは、サブクラスでも再宣言することなく使用することができます。

2. コンストラクタの作成

を使用するコンストラクタが2つあるので AttributeSet を初期化するために、 コンストラクタが呼び出す初期化メソッドを別に作成するのが便利です。

private void init(AttributeSet attrs) { 
    TypedArray a=getContext().obtainStyledAttributes(
         attrs,
         R.styleable.MyCustomView);

    //Use a
    Log.i("test",a.getString(
         R.styleable.MyCustomView_android_text));
    Log.i("test",""+a.getColor(
         R.styleable.MyCustomView_android_textColor, Color.BLACK));
    Log.i("test",a.getString(
         R.styleable.MyCustomView_extraInformation));

    //Don't forget this
    a.recycle();
}

R.styleable.MyCustomView は、自動生成された int[] リソースで、各要素は属性のIDである。属性は、XMLの各プロパティに対して、要素名に属性名を付加して生成されます。例えば R.styleable.MyCustomView_android_text には android_text 属性は MyCustomView . 属性は、このように TypedArray を使用して、様々な get 関数を使用します。もし、その属性がXMLで定義されていない場合は null が返されます。もちろん、戻り値の型がプリミティブの場合は例外で、その場合は第2引数が返される。

すべての属性を取得したくない場合は、この配列を手動で作成することが可能です。標準的なアンドロイドの属性のIDは android.R.attr 一方、このプロジェクトで使用する属性は R.attr .

int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor};

ご注意ください ではなく での使用は android.R.styleable のように このスレッド は、今後変更される可能性があります。これらの定数を一度に見ることができるのは便利なので、まだドキュメントに残っています。

3. などのレイアウトファイルで使用します。 layout\main.xml

名前空間宣言を含める xmlns:app="http://schemas.android.com/apk/res-auto" をトップレベルのxml要素に追加します。名前空間は、異なるスキーマが同じ要素名を使用した場合に発生する衝突を回避する方法を提供します ( 本論文 をご覧ください。) URLは、スキーマを一意に識別するための単なる方法です。 実際にそのURLでホストされる必要はありません。 . もしこれが何もしていないように見えるなら、衝突を解決する必要がない限り、実際には名前空間接頭辞を追加する必要がないからです。

<com.mycompany.projectname.MyCustomView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:text="Test text"
    android:textColor="#FFFFFF"
    app:extraInformation="My extra information"
/> 

完全修飾名を使用してカスタムビューを参照します。

Android LabelViewサンプル

完全な例が必要な場合は、android label view のサンプルを見てください。

LabelView.java

 TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
 CharSequences=a.getString(R.styleable.LabelView_text);

attrs.xml

<declare-styleable name="LabelView">
    <attr name="text"format="string"/>
    <attr name="textColor"format="color"/>
    <attr name="textSize"format="dimension"/>
</declare-styleable>

カスタムビュー_1.xml

<com.example.android.apis.view.LabelView
    android:background="@drawable/blue"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    app:text="Blue" app:textSize="20dp"/>

に含まれています。 LinearLayout をnamespace属性で指定します。 xmlns:app="http://schemas.android.com/apk/res-auto"

リンク