10

私はBeginning Android 4 Developmentを読んでいて、第5章ではGalleryImageVievsについて話し、その目的を説明せずにdeclare-styleable XMLタグを紹介しています..リファレンスでもいくつかの情報を見つけようとしましたが、運が悪い..例えば次のものがあります。

res/values/attrs.xml

<?xml version=”1.0” encoding=”utf-8”?> 
<resources>
    <declare-styleable name=”Gallery1”&gt;
        <attr name=”android:galleryItemBackground” />
    </declare-styleable>
</resources>

たとえば .java

public class GalleryActivity extends Activity {
[...]
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.main);
        Gallery gallery = (Gallery) findViewById(R.id.gallery1);
        gallery.setAdapter(new ImageAdapter(this)); 
        [...]
    }

    [...]

    public class ImageAdapter extends BaseAdapter {
        [...]
        int itemBackground;

        public ImageAdapter(Context c) {
            context = c;
            //---setting the style---
            TypedArray a = obtainStyledAttributes(
            R.styleable.Gallery1); 
            itemBackground = a.getResourceId(
                        R.styleable.Gallery1_android_galleryItemBackground, 0);
            a.recycle();
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView;
            [...]
            imageView.setBackgroundResource(itemBackground);
            return imageView; 
        }
    }
}

コードを数回読んだことがありますが、このスタイル可能なGallery1をname属性のみを持つ単一のattr子で定義する目的がよくわかりません..助けてもらえますか? このgalleryItemBackgroundはシステムによって提供されるものですか、それとも私たちが定義するものですか? このコードで何をしているのでしょうか?

助けてくれてありがとう!

4

1 に答える 1

15

このタグは、 で定義されている一連の事前作成された Android 属性の一部であり、属性名の前にある xml 名前空間プレフィックスR.Styleableからのカスタム スタイル可能タグと区別できます。android:

この特定の属性は、次のように説明されています。

ギャラリー アイテムの優先背景。これは、アダプタから提供するすべてのビューの背景として設定する必要があります。

ただし、カスタム属性タグには属性の名前だけでなく、そのタイプが必要であることは正しいです。たとえば、カスタム要素をattrs.xmlファイルに追加すると、次のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="MyCustomView"> 
        <attr name=”android:galleryItemBackground” />              
        <attr name="myCustomAttr" format="string" /> 
    </declare-styleable> 
</resources>

android:2 番目の属性にも名前空間がないことに注意してください。

編集:

この Styleables について詳しく説明している公式のドキュメント ページはありますか?

R.attrAndroid に含まれるさまざまな属性を確認してください(リンクをクリック)。それらはすべて既に宣言されているため、型を宣言する必要はありません。特定の属性に対してどの型が宣言されているかを知るには、関心のある属性の説明を見つけます。これ galleryItemBackgroundは、ご想像のとおり、別のリソースへの参照です。その他の可能性は、ブール値、フロート、色などです。

追加の参照: Andtoid は<declare-styleable>タグを使用してAttributeSet. TypedArrayを解析するために使用されますAttributeSet

[...] 上記のコードの目的が単にビューの背景のデフォルトの Drawable を取得することである場合、変数 itemBackground を getDrawable(android.R.attr.galleryItemBackground) で設定できませんでしたか?

この例では、属性が 1 つしかない場合、このパターンの有用性を確認するのは困難です。あなたはあなたが求めることをすることができます、そしてそれはより簡単かもしれません. ただし、コンストラクトは、コードですべてを実行する代わりに xml で特定の属性を設定できるようにすることで、UI の「外観」を「機能」から分離するという Android のマントラの一部です。Viewたとえば、クラスを取ります。xml ファイルで設定できる 30 を超える属性 (サイズ、パディング、クリック可能、フォーカス可能など) があります。のカスタム サブクラスを作成する人Viewは、xml でこれらの属性の一部またはすべてを設定するか、まったく設定できず、ビューが作成されるときに自動的に処理されます。必要に応じて属性を設定する同等のコードがありますが、サブクラス化するたびに想像してみてくださいViewすべての属性を xml で設定するオプションではなく、コードですべての属性を設定する必要がありました。

まったく同じことを行うクラス用の独自のリソースを作成することも簡単なことですが、組み込みのスタイルを使用すると、Android フレームワークのルック アンド フィールに一致するデフォルトのリソースが提供されます (オーバーライドしない場合)。

お役に立てれば。

于 2012-06-01T07:25:25.023 に答える