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

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>

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



답변

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

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

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


답변

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


답변

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

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

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


답변

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

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


답변

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

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

스타일 속성 참조


답변

이 블로그 게시물은 현재 테마 ( 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>


답변