2011-09-21 18 views
58

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

<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> 

दुर्भाग्य है कि बस यह भी मेरे लिए भ्रामक बना देता है। यह क्या कर रहा है

उत्तर

39

?attr/menuIconCamera मान का अर्थ है कि वर्तमान विषय के menuIconCamera विशेषता का एक आइकन उपयोग किया जाएगा।

फ़ाइल में menuIconCamera विशेषता को कहीं भी एक ड्रायबल असाइन किया जाना चाहिए। यदि इस विशेषता के विभिन्न मानों के साथ दो थीम हैं तो वास्तविक आइकन उस थीम पर निर्भर करेगा जो वर्तमान में उपयोग किया जाता है।

attrs.xml फ़ाइल का उपयोग कस्टम विशेषताओं को परिभाषित करने के लिए किया जाता है। इस परिभाषा के बिना संकलक अज्ञात गुणों को गलत के रूप में मानेंगे।

+1

आप बिल्कुल सही हैं में @color/primary_color को संदर्भित करता है, <आइटम नाम = "menuIconCamera"> @ drawable/ic_menu_camera_holo_light, धन्यवाद बहुत ज्यादा। मैं देखता हूं कि ic_menu_camera_holo_light एक स्थानीय ड्रॉबल है। क्या 3.x के पास 2.x की तरह निर्मित सार्वजनिक आइकन नहीं हैं? – FuegoFingers

+0

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

38

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

+3

आपूर्ति की गई लिंक बहुत उपयोगी थी। धन्यवाद! – sven

+3

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

+1

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

4

यह शैली के गुणों को प्रतिबिंबित करने के लिए है। R.attr

?[<package_name>:][<resource_type>/]<resource_name> 
देख

Referencing style attributes

+3

एक चीज जो कहीं भी प्रलेखित नहीं प्रतीत होती है वह यह है कि '' का पूरा पैकेज नाम है संसाधन जो भी घोषित किया। अधिक स्पष्ट रूप से, यह एक एक्सएमएल नेमस्पेस उपसर्ग नहीं है, भले ही वाक्यविन्यास सुझाव दे सकता है। उदाहरण के लिए एपकोपेट लाइब्रेरी द्वारा घोषित एक एआरआर को संदर्भित करने के लिए, 'android.support.v7.appcompat:' का उपयोग करें। – rockwalrus

13

मेरे अंग्रेजी अच्छी नहीं है, क्षमा करें। लेकिन मैं इस सवाल

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

+0

मुझे लगता है कि यह सबसे स्पष्ट जवाब है। – Clint

9

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

आम आदमी की दृष्टि में

तो,

someAttribute="?attr/attributeName" का मतलब है -

जो कुछ वर्तमान विषय

एक सामान्य उदाहरण में 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 वर्तमान विषय (AppTheme)

संबंधित मुद्दे