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=...됩니까?
Selvin

그래, 그래도 복사 / 붙여 넣기 덕분에 사용하지 않아도됩니다.
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
오류가 사라지지만 내보기는 속성 값을 채택하지 않지만 다른 (사용자 정의가 아닌) 속성을 채택합니다. 내 특정 특성은 열거 형입니다. 위의 스 니펫이 효과가 있습니까?
Paul Lammertsma

@PaulLammertsma 나는 열거 형을 사용하고 있으며 이것은 나에게도 효과가없는 것 같습니다. 사용자 정의 네임 스페이스 xmlns 속성이없는 경우 실제로 항목 이름 속성에 원하는 값을 입력하면 컴파일됩니다.
David Snabel-Caunt '12

@DavidCaunt 나는 결국 내가 작동하는 것을 얻었습니다 . 결국 declare-stylable열거 형 대신 문자열을 사용했습니다 . 열거 형이 작동하지 않는 이유는 확실하지 않지만이 해결 방법은 충분합니다.
Paul Lammertsma

3
이것은 심지어 API의 LVL (16)를 사용하여, 나를 위해 컴파일되지 않습니다
데이비드 마 일러에게

3
이것이 작동하는 동안 이름이 같은 속성이 둘 이상의 패키지에 있지만 패키지 이름이 다른 경우 속성을 확인하는 데 문제가있을 것으로 생각됩니다.
AndroidDev

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>

그래서 우리는 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

Styler와 vince의 수정이 저에게 효과적이었습니다. @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"/>
  • 마지막으로 스타일 파일에서 사용하십시오.

    스타일 파일과 레이아웃 파일의 차이점은 접미사를 추가하지 않는다는 것입니다 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);

이것이 올바르게 작동한다는 힌트는 R.styleable.MyTextViewStyleable_customFontattrs.xml 정의로 바로 이동하기 위해 Ctrl / Apple +를 클릭 할 수 있다는 것 입니다.

레이아웃 XML을 통해 (스타일 대신) 직접 전달할 때 사용자 지정 특성이 제대로 작동했기 때문에 내 코드와 다른 예제 간의 이러한 중요한 차이점을 발견하는 데 시간이 걸렸습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.