2012-01-11 6 views
30

मैं थीम और शैलियों से विशेषता मान पढ़ने की कोशिश कर रहा हूं जो प्लेटफ़ॉर्म के लिए डिज़ाइन किए गए थे जो कि मैं अपना आवेदन चला रहा हूं उससे नया।पुराने प्लेटफ़ॉर्म पर नए थीम विशेषताओं को पढ़ें

कृपया क्यों न पूछें। यदि आप लिखने वाले पुस्तकालयों के बारे में कुछ भी जानते हैं तो आपको पहले से ही पता होना चाहिए कि मैं मंच की क्षमताओं को धक्का देना चाहता हूं :)

मैं अनुमान के तहत परिचालन कर रहा हूं कि जब एंड्रॉइड शैलियों को संकलित किया जाता है तो विशेषता स्थिरांक का उपयोग किया जाता है चाबियों के लिए और इसलिए सैद्धांतिक रूप से किसी भी मंच पर किसी भी मंच पर पढ़ा जा सकता है। मैंने जो कुछ भी परेशानी के साथ अपने अन्य पुस्तकालयों में लेआउट एक्सएमएल के साथ ऐसा होने के लिए देखा है।

यहां एक बेस टेस्ट केस है जो समस्या दिखाता है। इसे एंड्रॉइड 3.0+ का उपयोग करके संकलित किया जाना चाहिए।

<resources> 
    <style name="Theme.BreakMe"> 
     <item name="android:actionBarStyle">@style/Widget.BreakMe</item> 
    </style> 
    <style name="Widget.BreakMe" parent="android:Widget"> 
     <item name="android:padding">20dp</item> 
    </style> 
</resources> 

तथ्य यह है कि इस android:actionBarStyle विशेष रूप से उपयोग करता irreleveant है। यह सब समझा जाना चाहिए कि यह एक विशेषता है जो केवल एंड्रॉइड 3.0 के साथ शुरू हो रही थी।

एंड्रॉइड 3.0 से पहले प्लेटफार्म पर अब तक इन मानों तक पहुंचने का प्रयास करने का तरीका है।

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Break Me" 
    style="?android:attr/actionBarStyle" 
    /> 

और

<declare-styleable name="Whatever"> 
    <item name="datStyle" format="reference" /> 
</declare-styleable> 

<style name="Theme.BreakMe.Take2"> 
    <item name="datStyle">?android:attr/actionBarSize</item> 
</style> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Break Me" 
    style="?attr/datStyle" 
    /> 

और

TypedValue outValue = new TypedValue(); 
context.getTheme().resolveAttribute(android.R.attr.actionBarStyle, outValue, true); 

और

int[] Theme = new int[] { android.R.attr.actionBarSize }; 
int Theme_actionBarSize = 0; 
TypedArray a = context.obtainStyledAttributes(attrs, Theme); 
int ref = a.getResourceId(Theme_actionBarSize, 0); 

और

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActionBar, android.R.attr.actionBarStyle, 0); 

वे सब के सब LogCat में परिणामस्वरूप यह त्रुटि उत्पन्न:

E/ResourceType(5618): Style contains key with bad entry: 0x010102ce 

0x010102ce निरंतर जो इंगित करने के लिए मंच विशेषता को खारिज किया जाता है इससे पहले कि मैं भी उपयोग करने के लिए एक मौका मिल सकता है लगता है android.R.attr.actionBarStyle की विशेषता मान है इसके मूल्य।

मैं थीम से इस तरह के गुण पढ़ने के लिए किसी अन्य तरीके की तलाश में हूं। मुझे पूरा यकीन है कि एक बार जब मैं शैली संदर्भ प्राप्त कर लेता हूं तो मुझे इसके गुणों को पढ़ने में परेशानी नहीं होगी।

क्या ऐसा करने का कोई संभावित तरीका है?

उत्तर

15

में मैं अनुमान के तहत काम कर रहा हूँ अनुभाग देखें कि जब एंड्रॉयड शैलियों विशेषता स्थिरांक क्या चाबी के लिए प्रयोग किया जाता है संकलित किए जाते हैं और इसलिए सैद्धांतिक रूप से सक्षम होना चाहिए किसी भी मंच पर किसी भी तरह से पढ़ा जाना चाहिए।

संभवतः, हालांकि यह नहीं है कि मैं सी ++ स्रोत कोड की व्याख्या कैसे कर रहा हूं जो आप देख रहे त्रुटि को उठाता है। frameworks/base/libs/utils/ResourceTypes.cpp में देखें।

if (e >= numEntries) { 
    LOGE("Style contains key with bad entry: 0x%08x\n", attrRes); 
    bag++; 
    continue; 
} 
:

numEntries = curPI->types[t].numEntries; 

आपकी प्रविष्टि सूचकांक उच्चतम जाना जाता प्रविष्टि तुलना में अधिक है:

मेरे व्याख्या एंड्रॉयड क्या संकुल> प्रकार-> संभव प्रविष्टियों में से एक में स्मृति तालिका के बराबर होता है

यह संभव है कि वे अन्य पैकेजों के विरुद्ध android के लिए इसे अलग-अलग प्रबंधित करें - android फ़र्मवेयर निर्माण समय पर ज्ञात मानों का उपयोग करता है (और आपकी जेनरेट एंट्री इंडेक्स अधिक है, क्योंकि यह एक नए प्लेटफॉर्म से है), गैर -android लोग मानते हैं कि कुछ भी वैध है।

यदि मेरा अनुमान सही है, तो आप जो करना चाहते हैं वह काम नहीं करेगा। ऐसा कहा जा रहा है कि, मेरे सी ++ दिन गंभीरता से मेरे पिछले दृश्य दर्पण में हैं, इसलिए मैं जो देख रहा हूं उसे गलत व्याख्या कर सकता हूं।

+0

इस में इतनी अच्छी तरह से खोदने के लिए धन्यवाद। –

+0

लिटिल ओटी, आप ResourceTypes.cpp को देखने के लिए कैसे जानते/सोचते थे? मैं आपके द्वारा उत्तर दिए गए कई प्रश्नों को देखता हूं @ कॉमन्सवेयर, इसलिए मैं आपको एंड्रॉइड विशेषज्ञ के रूप में सोचने के इच्छुक हूं। –

+1

@ रेडियोक्ट 1ve: मैंने शायद त्रुटि संदेश पाठ पर खोज की है। – CommonsWare

-1

शायद, आपको कुछ विषयों को परिभाषित करना होगा। पुराने उपकरणों के लिए फ़ोल्डर res/values-v11/themes.xml का उपयोग करें। "जबकि Android 2.x समर्थन Holo का उपयोग करना" http://android-developers.blogspot.com/2012/01/holo-everywhere.html

+8

इसमें इस प्रश्न के साथ कुछ भी नहीं है। – CommonsWare

4

शायद मुझे यहां अंतिम लक्ष्य याद आ रहा है, लेकिन मैंने निम्नलिखित उदाहरण को एक साथ रखा जो किसी भी 2.x डिवाइस पर बिना किसी समस्या के सभी विशेषताओं को पढ़ने में सक्षम था। उदाहरण 3.0 targetSdk के खिलाफ संकलित किया गया था।

styles.xml (शैलियों और विषयों घोषित)

<resources> 
    <style name="Theme.NewFeatures" parent="android:Theme"> 
     <item name="android:actionBarStyle">@style/Widget.MyActionBar</item> 
    </style> 
    <style name="Widget.MyActionBar" parent="android:Widget"> 
     <item name="android:padding">20dp</item> 
    </style> 
</resources> 

attrs.xml (घोषित विशेषता समूहों आप रनटाइम पर प्राप्त करने के लिए इच्छा)

<resources> 
    <declare-styleable name="ActionBarNewFeatures"> 
    <attr name="android:actionBarStyle" /> 
    </declare-styleable> 
    <declare-styleable name="MyWidgetNewFeatures"> 
     <attr name="android:padding" /> 
    </declare-styleable> 
</resources> 

AndroidManifest। xml (कस्टम थीम लागू करें)

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.NewFeatures" > 
    <activity 
     android:name=".SomeActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

SomeActivity.java (विशेषताओं के लिए खुदाई के लिए जाओ)

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    TypedArray a = obtainStyledAttributes(R.styleable.ActionBarNewFeatures); 
    //Get the style ID for the widget 
    int resid = a.getResourceId(R.styleable.ActionBarNewFeatures_android_actionBarStyle, -1); 
    a.recycle(); 

    a = obtainStyledAttributes(resid, R.styleable.MyWidgetNewFeatures); 
    int padding = a.getDimensionPixelSize(R.styleable.MyWidgetNewFeatures_android_padding, -1); 
    a.recycle(); 

    TextView tv = new TextView(this); 
    tv.setText(String.format("Padding will be %d px", padding)); 
    setContentView(tv); 
} 

जब तक मैं 3.0 के खिलाफ उदाहरण तो यह सब विशेषता नाम का समाधान कर सकते हैं संकलन के रूप में; प्रत्येक 2.X डिवाइस/एमुलेटर पर मैंने इसे स्केल किए गए पैडिंग आयाम को सेट करने के लिए थीम में और फिर विजेट शैली में सही ढंग से पढ़ा होगा।

आशा है कि मुझे कुछ बड़ा याद नहीं आया।

+1

यह बहुत ही आशाजनक दिखता है सिवाय इसके कि मैंने आपके जैसा ही परिणाम नहीं देखा है। त्रुटि अभी भी अपने सिर को logcat में पीछे रखती है। https://github.com/JakeWharton/PreHCABAttrs –

+0

मुझे अभी एहसास हुआ है कि मैंने जिन उपकरणों का परीक्षण किया है, वे 2.3 हैं (विचार एक 2.2 था, लेकिन यह स्पष्ट रूप से एक अद्यतन मिला)। मुझे 2.1/2.2 पर एक ही त्रुटि दिखाई देती है, इसलिए ऐसा लगता है कि उन्होंने 2.3 में प्रतिबंध हटा लिया है। आपका उदाहरण 2.3 पर काम करता है (ठीक है, यह दुर्घटनाग्रस्त हो जाता है लेकिन ऐसा इसलिए है क्योंकि नेविगेशन मोड परिभाषित नहीं होने पर int के रूप में वापस नहीं आता है ... यह संदर्भ आईडी के रूप में लौटाता है)। गलतफहमी के लिए खेद है। – Devunwired