किसी को attr की व्याख्या कर सकते हैं?


89

मैं हनीकॉम्ब गैलरी नमूना कोड ( यहां ) देख रहा हूं और अपने स्वयं के एक्शन आइटम जोड़ने की कोशिश करते हुए मैं निम्नलिखित कोड पर चला गया हूं:

<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 में था?
फुएगोफिंगर

मुझे नहीं लगता कि यह किसी भी तरह Android संस्करण से जुड़ा है। यह केवल चुने हुए विषय पर निर्भर विशेषताओं को बनाने का एक तरीका है।
माइकल

51

?attr:वाक्य रचना वर्तमान विषय की विशेषताओं तक पहुँचने के लिए प्रयोग किया जाता है। संदर्भित शैली विशेषताएँ देखें ।


3
आपूर्ति की गई कड़ी बहुत सहायक थी। धन्यवाद!
स्वेन

3
बहुत उपयोगी है, लेकिन आपको अभी भी उस लिंक के मुख्य भागों को पोस्ट करना चाहिए।
gustavohenke

1
यह लिंक किए गए लेख का सबसे सहायक हिस्सा था: 'एक शैली विशेषता संसाधन आपको वर्तमान में लागू थीम में एक विशेषता के मूल्य को संदर्भित करने की अनुमति देता है। एक शैली विशेषता को संदर्भित करने से आप यूआई तत्वों के लुक को कस्टमाइज़ कर सकते हैं, जिससे उन्हें वर्तमान थीम द्वारा आपूर्ति की जाने वाली मानक विविधताओं से मिलान करने की बजाय हार्ड-कोडित मूल्य की आपूर्ति की जा सकती है। एक शैली विशेषता को संदर्भित करते हुए अनिवार्य रूप से कहा जाता है, "वर्तमान विषय में इस विशेषता द्वारा परिभाषित शैली का उपयोग करें।" '
bigtex777

24

मुझे पता है कि यह पोस्ट बहुत पुरानी है, लेकिन मुझे लगता है कि निम्नलिखित स्पष्टीकरण शुरुआती लोगों को इसे आसानी से समझने में मदद करेंगे।

इसलिए आम आदमी की शर्तों में,

someAttribute="?attr/attributeName" माध्यम -

करंट थीम में मौजूद किसी भी विशेषता के मान के लिए someAttribute का मान सेट करें

टूलबार को स्टाइल करने में एक सामान्य उदाहरण होता है

<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 नाम स्थान उपसर्ग नहीं है, भले ही वाक्यविन्यास सुझाव दे सकता है। उदाहरण के लिए appcompat पुस्तकालय द्वारा घोषित एक attr को देखें, उपयोग करें 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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.