web-dev-qa-db-ja.com

宣言スタイル可能とスタイルの違い

Androidアプリケーションでスタイルなどをいじり始めましたが、これまでのところすべてが機能しています。「スタイル」を完全に理解しました ガイドのセクション =。

しかし、 このスレッド のように周りを見回すと、2つの違いを実際に理解することはできません(declare-stylableおよびstyle)。私の理解からdeclare-styleableは、その中で指定された属性を受け取り、それをスタイリング可能として指定します。次に、コードから必要に応じて属性を変更します。

しかし、これが実際に行われていることである場合、レイアウトで属性を定義する方が簡単ではないでしょうか。またはそれを指定するスタイルを宣言しますか?

24
Stephan

属性をスタイリング可能として宣言するかどうかの違いは次のとおりだと思います。

Attrs.xmlでは、「resources」セクション内で直接、または「declare-styleable」内でカスタム属性を宣言できます。

_<?xml version="1.0" encoding="utf-8"?>
<resources>
   <attr name="attrib1" format="string" />
 <declare-styleable name="blahblah">
    <attr name="attrib2" format="string" />
 </declare-styleable>
_

そこで、「attrib1」をスタイリング不可、「attrib2」をスタイリング可能と定義しました。

_layout/someactivity.xml_では、これらの属性を直接使用できます(名前空間は必要ありません)。

_<com.custom.ViewClass  attrib1="xyz" attrib2="abc"/>
_

_style.xml_宣言内で「styleable」属性「attrib2」を使用できます。ここでも、名前空間は必要ありません(レイアウトXMLで名前空間が使用されている場合でも)。

_ <style name="customstyle" parent="@Android:style/Widget.TextView">
    <item name="attrib2">text value</item>
    <!--  customize other, standard attributes too: -->
    <item name="Android:textColor">@color/white</item>
 </style>
_

次に、スタイルごとに属性を設定することもできます。

_<com.custom.CustomView attrib1="xyz" style="@style/customstyle"/>
_

これを行うと仮定しましょう。XMLで直接_attrib1_を設定し、スタイルで_attrib2_を設定します。

他の場所では、「blahblah」はこれらの属性を使用するカスタムビュークラスの名前である必要があり、レイアウトXMLでカスタム属性を参照するには名前空間を使用する必要があるという説明を見てきました。しかし、これはどれも必要ではないようです。

スタイリング可能とスタイリング不可能の違いは次のようです。

  • 「_style.xml_」宣言でスタイル設定可能な属性を使用できます。
  • カスタムクラスのコンストラクターは、スタイル付き属性とスタイルなし属性を異なる方法で読み取る必要があります。obtainStyledAttributes()のスタイル付き属性と、attr.getAttributeValue()などのスタイルなし属性です。 。

私がWebで見たほとんどのチュートリアルと例では、obtainStyledAttributes()のみが使用されていました。ただし、これは、スタイルを使用せずに、レイアウトで直接宣言された属性では機能しません。ほとんどのチュートリアルに示されているようにobtainStyledAttributes()を実行すると、属性_attrib1_はまったく取得されません。スタイルで宣言されているため、_attrib2_のみが取得されます。 attr.getAttributeValue()を使用する直接メソッドは機能します。

_ public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    String attrib1 = attrs.getAttributeValue(null, "attrib1");
    // do something with this value
 }
_

「_attrib1_」を宣言するために名前空間を使用しなかったため、getAttributeValue()の名前空間引数としてnullを渡します。

63
winitzki

これを確認してください スレッド

declare-styleableがないと、新しいカスタムの描画可能な状態を作成することはできません。

2
Vit Khudenko