1. ホーム
  2. android

[解決済み] Android におけるスタイル指定可能な属性の宣言

2023-06-29 23:20:21

質問

に関するドキュメントはほとんどありません。 declare-styleable タグについてのドキュメントはほとんどありません。私が見つけたのは このリスト に対して有効な値の format 属性の有効な値の一覧です。 attr タグを使用します。その限りではいいのですが、これらの値のいくつかをどのように使用するかについては説明されていません。ブラウジング attr.xml (標準属性の Android ソース) をブラウズしてみると、次のようなことができることがわかりました。

<!-- The most prominent text color.  -->
<attr name="textColorPrimary" format="reference|color" />

format 属性は明らかに複数の値の組み合わせで設定することができます。おそらくは format 属性は、パーサーが実際のスタイル値を解釈するのに役立ちます。その後、attr.xml でこれを発見しました。

<!-- Default text typeface. -->
<attr name="typeface">
    <enum name="normal" value="0" />
    <enum name="sans" value="1" />
    <enum name="serif" value="2" />
    <enum name="monospace" value="3" />
</attr>

<!-- Default text typeface style. -->
<attr name="textStyle">
    <flag name="normal" value="0" />
    <flag name="bold" value="1" />
    <flag name="italic" value="2" />
</attr>

これらは両方とも、示されたスタイルに対して許容される値のセットを宣言しているように見えます。

そこで、2つの質問があります。

  1. のいずれかを取ることができるスタイル属性の違いは何でしょうか? enum の値の一つを取ることができるものと、一連の flag の値を取ることができるものですか?
  2. 誰か、より良いドキュメントを知っていますか? declare-styleable がどのように機能するかについて、(Android のソース コードをリバース エンジニアリングする以外に)もっと良いドキュメントをご存知の方はいらっしゃいますか?

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

ここにこんな質問があります。 カスタム属性を定義する いくつかの を追加しました。

そして、この ポスト . フラグと列挙型についての良い情報があります。

カスタム XML 属性フラグ

フラグは特殊な属性です。 非常に小さな という非常に小さな値のサブセットしか許されないという点です。 の下で定義されたものです。 属性タグの下で定義されているものです。 フラグは次のように指定されます。 name "属性と "value "属性で指定されます。 属性で指定される。 名前は、その属性タイプ内で一意でなければなりません。 一意であることが要求される。 しかし、値は一意である必要はありません。 これは このため、Androidプラットフォームの進化に伴い Androidプラットフォームの進化の過程で 「fill_parent "と "match_parent "の両方が同じ動作に対応する が同じ動作にマッピングされていたのはこのためです。 その 値は同じでした。

name属性は に対応します。 レイアウトXMLで使用される名前に対応し、名前空間接頭辞は必要ありません。 名前空間接頭辞は必要ありません。 したがって、上記の "tilingMode "については、"center "を属性値として選択しました。 を属性値として選びました。 しかし を選択することもできた。 「繰り返し "を選ぶこともできたが、他にはなかった。 ただし 実際の値で代用することさえ は許されなかったでしょう。

value 属性は必ず 整数でなければなりません。 16進数か標準的な数値表現のどちらを選択するかは 標準的な数字表現を選択することができます。 はあなた次第です。 Androidのコードでは、いくつかの箇所で Androidのコードで両方が使われる場所がいくつかあります。 Androidコンパイラはどちらを使ってもかまいません。 Android コンパイラーはどちらを使ってもかまいません。

カスタム XML 属性列挙型

列挙型はフラグとほぼ同じ方法で使用されます。 フラグと同じように使用されますが、1つの規定があります。 と同じように使われます。 整数と同じように使うことができます。 フードの下では、列挙型と は同じデータ型にマッピングされます。 すなわち,整数です。 属性定義に が属性定義に現れる場合 の属性定義に現れるとき、Enum は、常に悪いものである "マジックナンバー" を防ぐのに役立ちます。 "マジックナンバー "を防ぐ役割を果たします。 このため 「android:layout_width "を持つことができます。 次元、整数値、または名前付き文字列 "fill_parent "です。

文脈を理解するために、次のように考えてみましょう。 というカスタム属性を作成したとします。 というカスタム属性を作成したとします。 「layout_scroll_height "というカスタム属性を作成し、それを受け取ったとします。 整数または文字列のどちらか 「scroll_to_top "とします。 これを行うには 「integer" フォーマット属性を追加し、その後に を追加し、それに列挙を加えます。

<attr name="layout_scroll_height" format="integer">  
    <enum name="scroll_to_top" value="-1"/> 
</attr>

この方法でEnumを使用する場合の一つの条件は を使用する場合の一つの条件は、開発者が を使用することができることです。 に意図的に"-1″という値を入れることができるということです。 をレイアウトパラメータに設定できることです。 この場合 という特殊なロジックが発生します。 "scroll_to_top "の特別なケースロジックが起動します。 このような予期せぬ(あるいは 予想外の(あるいは予想された)動作により、あなたのライブラリはすぐに レガシーコード "になってしまいます。 レガシーコード "の山に追いやることになります。 に追いやられてしまいます。


私が思うに、属性に現実に追加できる値は、属性から得られるものによって制限されます。を確認してみてください。 AttributeSet クラス参照 ここに を参照してください。

入手することができます。

  • ブーリアン( getAttributeBooleanValue ),
  • フロート ( getAttributeFloatValue ),
  • ints ( getAttributeIntValue ),
  • ints (たとえば getAttributeUnsignedIntValue ),
  • と文字列( getAttributeValue )