styles.xmlのカスタム属性


178

カスタムウィジェットを作成し、それをlayout.xmlで宣言しています。また、attr.xmlにいくつかのカスタム属性を追加しました。ただし、styles.xmlのスタイルでこれらの属性を宣言しようとすると、No resource found that matches the given name: attr 'custom:attribute'.

私は入れているxmlns:custom="http://schemas.android.com/apk/res/com.my.package"など、のstyles.xmlのタグのすべてに<?xml><resources><style>、それはまだそれが私のカスタムXML名前空間を見つけることができないことを、私は同じエラーを与えます。

ただし、名前空間を使用して、layout.xmlのビューに属性を手動で割り当てることができるため、名前空間に問題はありません。私の問題は、styles.xmlが私のattr.xmlを認識するようにすることです。


1
cutsom:xmlns=...?? すべきではないxmlns:cutsom=...
セルビン

ええ、それは私がコピー/貼り付けのおかげで使用しないことで得られるものです
styler1972

回答:


362

私はそれを考え出した!答えは、スタイルに名前空間を指定しないことです。

<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="CustomStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>

        <item name="custom_attr">value</item> <!-- tee hee -->
    </style>
</resources>

13
エラーは消えますが、私のビューは属性値を採用しませんが、他の(非カスタム)属性を採用します。私の特定の属性は列挙型です。上記のスニペットはあなたのために働いていますか?
ポールランメルツマ

@PaulLammertsma私は列挙型を使用していますが、これも私にはうまくいかないようです。カスタム名前空間のxmlns属性がない場合は、実際に項目名属性に任意の値を入力してコンパイルできます。
David Snabel-Caunt、2011

@DavidCaunt私は最終的に私が機能しているものを手に入れまし。最終的declare-stylableに、列挙型ではなく文字列を使用しました。enumが機能しなかった理由はわかりませんが、この回避策で十分です。
Paul Lammertsma

3
これはさえ16 LVL APIを使用して、私のためにコンパイルされません
デビッド・ミレル

3
これは機能しますが、同じ名前の属性が複数のパッケージに存在し、パッケージ名が異なる場合、属性の解決に問題があると思います。
AndroidDev 2015

43

上記の答えは私のために働きました、私は少し変更を試みました、私はリソース要素のクラスのスタイル可能を宣言します。

<declare-styleable name="VerticalView">
    <attr name="textSize" format="dimension" />
    <attr name="textColor" format="color" />
    <attr name="textBold" format="boolean" />
</declare-styleable>

宣言-styleable名前の属性は、クラス名を参照し、私はビュークラスの呼び出し「com.my.package.name.VerticalView」を持っていたので、それはこの宣言がVerticalViewまたはVerticalViewのサブクラスでの使用でなければならない表現。したがって、次のようにスタイルを宣言できます。

<resources>
    <style name="verticalViewStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">36dip</item>

        <item name="textSize">28sp</item>  <!-- not namespace prefix -->
        <item name="textColor">#ff666666</item>
        <item name="textBold">true</item>
    </style>
</resources>

それがリソース要素で名前空間を宣言しなかった理由です、それはまだ機能します。


11

values / styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="defaultButtonColor">@color/red</item>
    <item name="defaultButtonHeight">@dimen/dp_100</item>
</style>

values / attrs.xml

<resources>
    <attr name="defaultButtonColor" format="reference" />
    <attr name="defaultButtonHeight" format="reference"/>
</resources>

values / colors.xml

<resources>
    <color name="red">#f00</color>
</resources>

values / dimens.xml

<resources>
    <dimen name="dp_100">100dp</dimen>
</resources>

使用する

<Button
    android:layout_width="wrap_content"
    android:layout_height="?attr/defaultButtonHeight"
    android:text="Button"
    android:textColor="?attr/defaultButtonColor"
    />

ここに画像の説明を入力してください

デモ


10

スタイラーとヴィンスの修正は私のために働いた。@vinceの説明は完全に正確ではない可能性があることを指摘したかったのです。

declare-styleableカスタムビュークラスの名前と一致する名前属性により、名前空間なしでカスタム属性にアクセスできるという仮説をテストするために、名前を変更しましたdeclare-styleable(カスタムビューの名前はTestViewFont

<declare-styleable name="TextViewFont2">
    <attr name="font" format="integer"/>
</declare-styleable>

次に、obtainStyledAttributesこれを反映するようにカスタムビューの呼び出しを変更しました。

TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TextViewFont2, 0, 0);

コードはまだ実行されました。したがって、私はdeclare-styleableそれが名付けられたクラスのある種の内省ではないと思います。

したがって、名前空間を参照せずにスタイルを宣言するためにカスタム属性を使用できると私は信じています。

とにかく、すべての助けてくれてありがとう、それは私の問題を解決しました。


実際、属性は、declare-styleableブロックで宣言されているかどうかにかかわらず、同じ名前空間を共有します。(申し訳ありませんが、これのリファレンスページが見つかりません...)android名前空間の属性を除き、属性名のみを指定する必要があります。
pr-shadoko

3
  • いくつかの属性を定義する

<declare-styleable name="refreshPullRefreshLayout">
        <attr name="refreshColors" format="reference"/>
        <attr name="refreshColor" format="reference"/>
</declare-styleable>
  • のようなレイアウトファイルで使用してください

<com.aolphn.PullRefreshLayout
     app:refreshColor="@color/main_green"
     app:refreshColors="@array/refresh_color"/>
  • 最後にスタイルファイルで使用します

    スタイルファイルとレイアウトファイルの違いは、prefiexを追加しないことです。 app:
<style name="refreshStyle">
    <item name="refreshColor">@color/main_green</item>
    <item name="refreshColors">@array/refresh_color</item>
</style>

それを試してみて、良い一日を過ごしてください、これは私のために働きます。


2

それが他の誰かを助ける場合、私のミスは私のカスタムビュークラスがAttributeSet.getAttributeValueを呼び出していたということでした。例えば

String fontName = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "customFont");

...その結果、カスタムビューのカスタム属性が読み込まれなくなりました。

修正はobtainStyledAttributes私のカスタムビューで使用することでした:

 TypedArray styleAttrs = context.obtainStyledAttributes(attrs, R.styleable.MyTextViewStyleable);
 String fontName = styleAttrs.getString(R.styleable.MyTextViewStyleable_customFont);

これが正しく機能しているというヒントは、Ctrl / Apple R.styleable.MyTextViewStyleable_customFontキーを押しながらをクリックして、attrs.xml定義に直接移動できることです。

カスタム属性が(スタイルではなく)レイアウトXMLから直接渡されたときに正常に機能したため、コードと他の例のこの重要な違いを見つけるのにしばらく時間がかかりました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.