web-dev-qa-db-ja.com

styles.xmlのカスタム属性

カスタムウィジェットを作成し、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"<?xml><resources>など、styles.xmlのすべてのタグに<style>を挿入しましたが、それでも同じエラーが発生します。カスタムXML名前空間が見つかりません。

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

173
styler1972

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

<?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>
354
styler1972

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

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

declare-styleablename属性はクラス名を参照したため、ビュークラス呼び出し「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>

そのため、resources要素で名前空間を宣言しませんでしたが、引き続き機能します。

40
VinceStyling

スタイラーとヴィンスの修正がうまくいきました。 @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による何らかの内観とは思わない。

したがって、カスタム属性を使用して、名前空間を参照せずにスタイルを宣言できると考えられます。

とにかく、すべての支援者に感謝します、それは私の問題を解決しました。

8
Abid H. Mujtaba

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"
    />

enter image description here

DEMO

5
Phan Van Linh

それが他の誰かを助ける場合、私のミスは私のカスタムビュークラスが 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を介して(スタイルではなく)直接渡されたときに正常に機能したため、コードと他の例とのこの重大な違いを見つけるのに時間がかかりました。

1
Dan J
  • いくつかの属性を定義する

<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>

それを試して、素敵な一日を過ごしてください、これは私のために動作します。

0
Aolphn