사용자 정의보기를 위해 attrs.xml에서 동일한 이름의 속성


179

동일한 이름의 속성을 공유하는 몇 가지 사용자 정의보기를 작성하고 있습니다. 해당 <declare-styleable>섹션에서 attrs.xml속성에 동일한 이름을 사용하고 싶습니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyView1">
        <attr name="myattr1" format="string" />
        <attr name="myattr2" format="dimension" />
        ...
    </declare-styleable>

    <declare-styleable name="MyView2">
        <attr name="myattr1" format="string" />
        <attr name="myattr2" format="dimension" />
        ...
    </declare-styleable>
</resources>

나는 그 말을하여 오류가 발생 myattr1하고 myattr2이미 정의되어 있습니다. 및 에 대한 format속성을 생략해야한다는 것을 알았지 만 그렇게하면 콘솔에서 다음 오류가 발생합니다.myattr1myattr2MyView2

[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute 

내가 이것을 달성 할 수있는 방법이 있습니까? 어쩌면 일종의 네임 스페이스 (추측)입니다.

답변:


401

솔루션 : 두보기에서 공통 속성을 추출하여 <resources>노드의 하위로 직접 추가 하십시오.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="myattr1" format="string" />
    <attr name="myattr2" format="dimension" />

    <declare-styleable name="MyView1">
        <attr name="myattr1" />
        <attr name="myattr2" />
        ...
    </declare-styleable>

    <declare-styleable name="MyView2">
        <attr name="myattr1" />
        <attr name="myattr2" />
        ...
    </declare-styleable>
</resources>

11
myattr1문자열이 MyView1있고 정수 가되면 어떻게됩니까 MyView2?
foxx1337

4
나는 그렇게 생각하지 않습니다. 예를 들어 '방향'속성을 가질 수 있으며 어떤 관점에서는 '수평'/ '수직'과 다른 '풍경'/ '세로'/ '사각'입니다. 내 관점에서 볼 때 안드로이드의 버그 (또는 적어도 일관되지 않은 동작)입니다. 1. stylable 속성은 항상 prefix = view name으로 시작하고 2. 그러한 뷰에 대해 별도의 라이브러리 프로젝트를 만들면 모든 것이 잘 작동합니다. )
se.solovyev

4
이 답변을 ERROR: In <declare-styleable> com_app_view_widget, unable to find attribute customAttr 따르면 선언하려고하는 모든보기에 대해 얻 습니다. 어떤 아이디어?
Dapp

45
@Google : Crappy 디자인
Glenn Bech 2016 년

6
@ foxx1337 그냥 사용하십시오 <attr name="myattr1" format="string|integer" />. 나를 위해 작동합니다.
Mygod

57

위에 게시 된 솔루션이 Android Studio에서 나에게 적합하지 않으므로이 답변을 게시하고 있습니다. 사용자 정의보기에서 내 사용자 정의 속성을 공유해야하므로 Android Studio에서 위의 솔루션을 시도했지만 운이 없었습니다. 실험을 해보았습니다. 누군가가 같은 문제를 찾는 데 도움이되기를 바랍니다.

  <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <!-- parent styleable -->
     <declare-styleable name="MyView">
         <attr name="myattr1" format="string" />
         <attr name="myattr2" format="dimension" />
     </declare-styleable>

     <!-- inheriting parent styleable -->
     <!-- also note "myBackgroundColor" belongs to child styleable"MyView1"-->
    <declare-styleable name="MyView1" parent="MyView">
        <attr name="myattr1" />
        <attr name="myattr2" />
        <attr name="myBackgroundColor" format="color"/>
    </declare-styleable>


    <!-- inheriting parent styleable -->
    <!-- same way here "myfonnt" belongs to child styelable "MyView2" -->
    <declare-styleable name="MyView2" parent="MyView">
        <attr name="myattr1" />
        <attr name="myattr2" />
        <attr name="myfont" format="string"/>
        ...
    </declare-styleable>
</resources>

이것은 나를 위해 완전히 작동합니다. 우리는 Parent를 스타일링해야하고, 그 부모 스타일을 상속 받아야합니다. 예를 들어, 위에서 한 것처럼 : Parent styleable name MyView이고 이것을 MyView1 및 MyView2와 같은 다른 스타일로 상속했습니다.


1
이것은 나를 위해 일했습니다. 수락 된 답변에서 코드의 추출 된 속성을 참조하는 방법을 찾을 수 없습니다.
Nemanja Kovacevic

흠 .. 이상해. 받아 들여진 해결책이 나를 위해 잘 작동하는 것 같습니다 (targetSdkVersion 27). "text"와 같은 속성이 일반적이기 때문에 다른 attrs.xml ..에 존재할 수 있습니까?
Aba

나는 가장 흔하지 않은 이름으로 시도했으며 허용 된 솔루션은 여전히 ​​나를 위해 일했습니다.
Aba

첫 의견에 동의합니다! typedArray에서 추출 된 속성을 참조 할 방법이 없습니다. 따라서 스타일있는 부모를 정의해야합니다
reavcn

일이이 부모의 속성이 아닌 아이에 해결하는 것을 잊지 마세요 (클래스에 대한 MyView2권리 : R.styleable.MyView2_myattr1잘못 : R.styleable.MyView_myattr1)
vigilancer

27

프리 야 싱할 (Priya Singhal)이 대답 한대로 Android Studio에서는 공통 속성 이름을 고유 한 스타일 이름으로 정의해야합니다. 그들은 더 이상 뿌리에있을 수 없습니다.

그러나 주목해야 할 몇 가지 다른 사항이 있습니다 (따라서 답변을 추가하는 이유도 있음).

  • 일반적인 스타일은 뷰와 같은 이름을 지정할 필요가 없습니다. ( 점을 지적 해 주셔서 감사합니다 .)
  • 부모와 상속을 사용할 필요는 없습니다.

다음은 동일한 속성을 공유하는 두 개의 사용자 정의보기가있는 최근 프로젝트에서 수행 한 작업입니다. 사용자 정의보기에 여전히 속성의 이름이 있고를 포함하지 않는 format한 코드에서 정상적으로 액세스 할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- common attributes to all custom text based views -->

    <declare-styleable name="TextAttributes">
        <attr name="text" format="string"/>
        <attr name="textSize" format="dimension"/>
        <attr name="textColor" format="color"/>
        <attr name="gravity">
            <flag name="top" value="48" />
            <flag name="center" value="17" />
            <flag name="bottom" value="80" />
        </attr>
    </declare-styleable>

    <!-- custom text views -->

    <declare-styleable name="View1">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

    <declare-styleable name="View2">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

</resources>

간소화 된 예

실제로 속성을 사용자 정의 이름으로 넣을 필요조차 없습니다. format적어도 하나의 사용자 정의보기에 대해 정의 ()를 제공하는 한 어디에서나 ()없이 사용할 수 있습니다 format. 그래서 이것은 또한 작동하고 깨끗해 보입니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="View1">
        <attr name="text" format="string"/>
        <attr name="textSize" format="dimension"/>
        <attr name="textColor" format="color"/>
        <attr name="gravity">
            <flag name="top" value="48" />
            <flag name="center" value="17" />
            <flag name="bottom" value="80" />
        </attr>
    </declare-styleable>

    <declare-styleable name="View2">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

</resources>

그러나 대규모 프로젝트의 경우이 작업이 지저분해질 수 있으며 단일 위치에서 맨 위에 정의하는 것이 좋습니다 ( 여기서 권장 됨 ).


상속에 어떤 문제가 있습니까? 관련 스타일 러블과 관련된 사용자 지정 뷰 계층 구조가이 관계를 반영하지 않습니다.이 관계는 명명 규칙과 그 안에 정의 된 특정 항목에 의해서만 관련 스타일 정의에서 추론 할 수 있습니다 (일부 스타일에 속하고 일부는 다른 스타일에 속함). 오히려 parent속성 으로 명시 적으로 만들고 싶지만 사용법을 제안하는 많은 게시물을 보지 못했습니다.
samis

@ samis, 나는 이것에 대해 한동안 노력하지 않았지만을 사용하는 데 아무런 문제가 없다 parent. 나는 그것이 필요하지 않다고 말한 것 같습니다.
Suragch

필요하지는 않습니다. 저는 기본 클래스에 넣고 싶지 않은 추가 속성으로 래핑 된 또 다른 하위 클래스를 만들었습니다. 의견과 명명 규칙을 사용하여 분리를 나타냅니다.
samis

8

고맙습니다 Lewis 나는 같은 문제가 있었고 상속 솔루션은 아래처럼 그것을 수행하는 힌트를 주었고 잘 작동합니다. 위에서 공통 속성을 선언하고 서식 선언없이 다시 스타일 선언의 본문에 다시 작성하십시오. 누군가에게 도움이되기를 바랍니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- common attributes -->
     <attr name="myattr1" format="string" />
     <attr name="myattr2" format="dimension" />

 <!-- also note "myBackgroundColor" belongs to child styleable"MyView1"-->
<declare-styleable name="MyView1" >
    <attr name="myattr1" />
    <attr name="myattr2" />
    <attr name="myBackgroundColor" format="color"/>
</declare-styleable>

<!-- same way here "myfonnt" belongs to child styelable "MyView2" -->
<declare-styleable name="MyView2" parent="MyView">
    <attr name="myattr1" />
    <attr name="myattr2" />
    <attr name="myfont" format="string"/>
    ...
</declare-styleable>


1

사용 가능한 솔루션을 시도한 후에도 여전히이 문제가 발생하는 경우를 대비하여. 형식 이 추가 된 subtitle속성을 고수했습니다 string.

내 해결책은 형식을 제거하는 것입니다.

전에:

<attr name="subtitle" format="string"/>

후:

<attr name="subtitle"/>

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