누군가 attr을 설명 할 수 있습니까?


89

Honeycomb Gallery 샘플 코드 ( 여기 )를보고 있으며 내 앱에 작업 항목을 추가하는 동안 다음 코드를 실행했습니다.

<item android:id="@+id/camera"
    android:title="Camera"
    android:icon="?attr/menuIconCamera"
    android:showAsAction="ifRoom" />

?attr루프 날 던지고있다. 누군가 이것이 무엇을하는지 설명해 주시겠습니까? 이것은 드로어 블과 어떤 관련이 있습니까? Google에서 좋은 정보를 찾을 수없는 것 같습니다. 또한 아이콘 대신 사용할 수있는 속성 목록이나 갤러리가 menuIconCamera있습니까?

감사

편집 : 나는 좀 더 둘러보고 attrs.xml이 다음과 같은 것을 발견했습니다.

<resources>
<declare-styleable name="AppTheme">
    <attr name="listDragShadowBackground" format="reference" />
    <attr name="menuIconCamera" format="reference" />
    <attr name="menuIconToggle" format="reference" />
    <attr name="menuIconShare" format="reference" />
</declare-styleable>

불행히도 그것은 나를 더욱 혼란스럽게 만듭니다. 이게 뭐하는거야?

답변:


64

?attr/menuIconCamera에서 아이콘 값 수단 menuIconCamera현재 테마의 특성이 사용됩니다.

파일 menuIconCamera어딘가에 속성에 할당 된 드로어 블이 있어야 themes.xml합니다. 이 속성 값이 다른 두 개의 테마가있는 경우 실제 아이콘은 현재 사용중인 테마에 따라 달라집니다.

attrs.xml파일은 사용자 정의 속성을 정의하는 데 사용됩니다. 이 정의가 없으면 컴파일러는 알 수없는 속성을 오류로 처리합니다.


1
당신 말이 맞습니다. <item name = "menuIconCamera"> @ drawable / ic_menu_camera_holo_light </ item>, 정말 감사합니다. ic_menu_camera_holo_light가 로컬 드로어 블이라는 것을 알았습니다. 3.x에는 2.x와 같은 공개 아이콘이 내장되어 있지 않습니까?
FuegoFingers 2011 년

나는 그것이 어떻게 든 안드로이드 버전에 연결되어 있다고 생각하지 않습니다. 이것은 선택한 테마에 따라 속성을 만드는 방법 일뿐입니다.
Michael

51

?attr:구문은 현재 테마의 속성에 액세스하는 데 사용됩니다. 스타일 속성 참조를 참조 하십시오 .


3
제공된 링크는 매우 유용했습니다. 감사!
sven

3
매우 유용하지만 여전히 해당 링크의 주요 부분을 게시해야합니다.
gustavohenke 2015 년

1
이것은 링크 된 기사의 가장 유용한 부분이었습니다. '스타일 속성 리소스를 사용하면 현재 적용된 테마의 속성 값을 참조 할 수 있습니다. 스타일 속성을 참조하면 하드 코딩 된 값을 제공하는 대신 현재 테마에서 제공하는 표준 변형과 일치하도록 스타일을 지정하여 UI 요소의 모양을 사용자 정의 할 수 있습니다. 스타일 속성을 참조하면 기본적으로 "현재 테마에,이 속성에 의해 정의 된 스타일을 사용합니다."라고 말한다 '
bigtex777

24

이 게시물이 매우 오래되었다는 것을 알고 있지만 다음 설명이 초보자가 쉽게 이해하는 데 도움이 될 것이라고 생각합니다.

그래서 평신도의 관점에서,

someAttribute="?attr/attributeName" 의미-

someAttribute 의 값을 현재 테마 의 attributeName 값으로 설정하십시오.

일반적인 예는 툴바 스타일 지정에서 발생합니다.

<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/primary_color</item>
       //some more stuff here
</style>
<!-- custom toolbar style -->
<style name="myToolbar" parent="Widget.AppCompat.Toolbar">
      <item name="android:background">?attr/colorPrimary</item>
     //some code here
</style>

현재 테마 (AppTheme)에서 참조하기 때문에 값 android:background이로 설정됩니다.@color/primary_color?attr/colorPrimary@color/primary_color


17

제 영어 실력이 좋지 않아요. 하지만 나는이 질문을 알고

android:icon="?attr/menuIconCamera" 사용하고 싶다

attrs.xml

<resources>
    <declare-styleable name="AppTheme">
        <attr name="listDragShadowBackground" format="reference" />
        <attr name="menuIconCamera" format="reference" />
        <attr name="menuIconToggle" format="reference" />
        <attr name="menuIconShare" format="reference" />
    </declare-styleable>
</resources>

styles.xml

<style name="AppTheme.Light" parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarStyle">@style/ActionBar.Light</item>
        <item name="android:windowActionBarOverlay">true</item>
        <item name="listDragShadowBackground">@android:color/background_light</item>
        <item name="menuIconCamera">@drawable/ic_menu_camera_holo_light</item> //this....
        <item name="menuIconToggle">@drawable/ic_menu_toggle_holo_light</item>
        <item name="menuIconShare">@drawable/ic_menu_share_holo_light</item>
    </style>

사용하다 @drawable/ic_menu_camera_holo_light


4

이것은 스타일 속성을 참조하기위한 것입니다. R.attr 참조

?[<package_name>:][<resource_type>/]<resource_name>

스타일 속성 참조


3
어디에도 문서화되지 않은 것처럼 보이는 한 가지는 '<package_name>'이 리소스를 선언 한 모든 패키지 이름이라는 것입니다. 좀 더 구체적으로 말하자면, 구문에서 암시 할 수 있지만 XML 네임 스페이스 접두사가 아닙니다. 예를 들어 appcompat 라이브러리에서 선언 한 속성을 참조하려면 android.support.v7.appcompat:.
정지에 지장을주지 커뮤니티

4

이 블로그 게시물은 현재 테마 ( https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/)에 정의 된 스타일 속성의 값을 참조하는 방법에 대한 놀라운 작업을 수행합니다.

  • ?표기법이 표시 되면 현재 테마에 따라 달라질 수있는 값인 스타일 속성을 참조하려고한다는 의미입니다. 각각의 특정 테마에서이 속성을 재정의 할 수 있으므로 XML 레이아웃을 변경할 필요가 없으며 올바른 테마를 적용해야합니다.

  • @표기법 을 볼 때 실제 리소스 값 (색상, 문자열, 차원 등)을 참조합니다. 이 리소스에는 실제 값이 있어야합니다. 이 경우 우리는 우리가 다루는 가치를 정확히 알고 있습니다.

예를 들면 다음과 같습니다.

    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="LauncherButton" parent="TextAppearance.AppCompat.Medium">
        <item name="android:textColor">?colorAccent</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_centerHorizontal">true</item>
        <item name="android:textAllCaps">false</item>
    </style>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.