ใครสามารถอธิบาย attr?


90

ฉันกำลังดูโค้ดตัวอย่างของ 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>

น่าเสียดายที่มันทำให้ฉันสับสนมากขึ้น นี่มันกำลังทำอะไร?

คำตอบ:


65

?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

ฉันไม่คิดว่ามันเชื่อมต่อกับเวอร์ชัน Android นี่เป็นเพียงวิธีการสร้างคุณลักษณะขึ้นอยู่กับธีมที่เลือก
Michael

51

?attr:ไวยากรณ์ถูกนำมาใช้สำหรับการเข้าถึงคุณลักษณะของชุดรูปแบบปัจจุบัน ดูอ้างอิงแอตทริบิวต์สไตล์


3
ลิงค์ที่ให้มานั้นมีประโยชน์มาก ขอบคุณ!
เวน

3
มีประโยชน์มาก แต่คุณควรโพสต์ส่วนหลักของลิงก์นั้น
gustavohenke

1
นี่เป็นส่วนที่มีประโยชน์ที่สุดของบทความที่เชื่อมโยง: 'ทรัพยากรแอตทริบิวต์สไตล์ช่วยให้คุณสามารถอ้างอิงค่าของแอตทริบิวต์ในธีมที่ใช้ในปัจจุบัน การอ้างอิงแอตทริบิวต์ style ช่วยให้คุณสามารถปรับแต่งรูปลักษณ์ขององค์ประกอบ UI ได้โดยจัดแต่งทรงผมให้ตรงกับรูปแบบมาตรฐานที่จัดทำโดยชุดรูปแบบปัจจุบันแทนที่จะให้ค่าแบบฮาร์ดโค้ด อ้างอิงแอตทริบิวต์ style โดยพื้นฐานแล้วกล่าวว่า "ใช้สไตล์ที่กำหนดโดยแอตทริบิวต์นี้ในธีมปัจจุบัน"
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>

นี่ค่าของandroid:backgroundจะถูกตั้งค่าเป็น@color/primary_colorเพราะ?attr/colorPrimaryอ้างถึง@color/primary_colorในธีมปัจจุบัน (AppTheme)


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 แม้ว่าไวยากรณ์อาจแนะนำเช่นนั้น ยกตัวอย่างเช่นการอ้างถึง attr ประกาศโดยห้องสมุด 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.