2011-01-03 4 views
20

私はアンドロイドのアプリケーションでスタイルなどを使い始めています。私はかなり 'スタイル'を理解したsection of the guide宣言スタイルのスタイルとスタイルの違い

しかし、周りを見て、this threadのように、私は実際には2つの違い(declare-stylablestyle)を理解することはできません。 私の理解では、declare-styleableはその中で指定された属性を取り込み、それをスタイル可能なものとして指定してから、コードから変更します。

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

答えて

52

属性をスタイル可能と宣言することとの間には、次の違いがあると思います。

attrs.xmlでは、直接「リソース」セクション内または「宣言-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> 

はだから今、私たちは「非styleableとして「attrib1」を定義しましたattrib2 "をスタイル可能にします。

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

あなたはstyle.xml宣言内「styleable」属性「attrib2」を使用することができます。

layout/someactivity.xmlでは、我々は、直接(必要な名前空間を)これらの属性を使用することはできません。ここでも、(レイアウト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のカスタム属性を参照するために名前空間を使用する必要があるという記述があります。しかし、これのどれも必要ではないようです。

styleableと非styleableとの違いは、ことのようです:あなたは「style.xml」宣言でstyleable属性を使用することができます

  • カスタムクラスのコンストラクタは、スタイル別の属性を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を渡します。

+0

大変お答えします。私ができるならそれを複数回投票するだろう。 –

+0

正確に私の問題については、クールな答え –

+0

清潔な説明、ポイントにまっすぐ。 – VallaDanger

2

これをチェックするthread

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

+0

違いは、declare-styleableを使うと、描画状態のような魔法を使うことができる新しい属性を導入することができます(他の用途がなければならないと思います)。そして、スタイルはすでに一連の属性既存ですか?ありがとう、ありがとう。 – Stephan

関連する問題