2011-09-01 14 views
45

एंड्रॉयड में, आप getTheme() से एक Resource.Theme वस्तु के रूप में एक गतिविधि की वर्तमान विषय मिल सकता है। साथ ही, आप setTheme(R.style.Theme_MyTheme) में थीम को अन्य थीम के संसाधन आईडी के माध्यम से थीम को अलग-अलग सेट कर सकते हैं।एंड्रॉइड: वर्तमान विषय की संसाधन आईडी कैसे प्राप्त करें?

लेकिन मैं बाहर चाहे वह इसके लायक है कि कैसे मिल रहा है - चाहे वर्तमान विषय पहले से ही एक है कि मैं सेट करना चाहते हैं? मैं getTheme().getResourceId() की तरह कुछ के लिए देख रहा हूँ, ताकि तरह कुछ लिखने के लिए:

protected void onResume() { 
    int newThemeId = loadNewTheme(); 
    if (newThemeId != getTheme().getResourceId()) { // !!!! How to do this? 
     setTheme(newThemeId); 
     // and rebuild the gui, which is expensive 
    } 
} 

कोई भी विचार?

+0

मुझे नहीं लगता कि संसाधन आईडी थीम क्लास का एक योगदान है। थीम संसाधन xml फ़ाइल से बनाई जा सकती है, लेकिन फिर आईडी का संदर्भ खो गया है। थीम स्वयं ही बदल सकती है, और फिर इसका कोई निश्चित संसाधन आईडी से बंधने का कोई अर्थ नहीं होगा। और भी, विषय कोड में फ्लाई पर बनाया जा सकता है। आपको वर्तमान विषय के लिए किस संसाधन आईडी का उपयोग किया गया था, इसका ट्रैक रखना होगा। – Anderson

+0

यह उत्तर आपकी मदद करेगा। इसे चेकआउट करें http://stackoverflow.com/a/26302184/4639479 –

उत्तर

34

ठीक यहाँ एक पहेली टुकड़ा है: के रूप में आवेदन स्तर पर निर्धारित विषय के लिए context.getApplicationInfo().theme रूप AndroidManifest.xml में सेट है, हम डिफ़ॉल्ट विषय हो सकता है, और एक गतिविधि के भीतर से, कि गतिविधि के लिए getPackageManager().getActivityInfo(getComponentName(), 0).theme के रूप में।

मुझे लगता है कि हमें एक कस्टम getTheme() और setTheme() के लिए अपने स्वयं के आवरण करने के लिए एक प्रारंभिक बिंदु देता है लगता है।

फिर भी है कि एपीआई के साथ बजाय के आसपास काम कर की तरह लगता है। तो मैं यह देखने के लिए खुला प्रश्न छोड़ दूंगा कि कोई बेहतर विचार के साथ आता है या नहीं।

+0

इस बारे में यहां महसूस करना और इसे ढूंढने के लिए +1। –

+12

'संदर्भ 'पर' getThemeResId()' विधि है लेकिन दुर्भाग्य से यह सार्वजनिक नहीं है :-( –

27

मैं संसाधन आईडी प्राप्त किए बिना आवश्यकता को हल करने के लिए एक रास्ता मिल गया।

मैं स्ट्रिंग के नाम के साथ मेरी विषयों में से प्रत्येक के लिए एक आइटम जोड़ रहा:

<item name="themeName">dark</item> 

और कोड में मैं बहुत तरह के नाम की जांच:

TypedValue outValue = new TypedValue(); 
getTheme().resolveAttribute(R.attr.themeName, outValue, true); 
if ("dark".equals(outValue.string)) { 
    ... 
} 
+1
+1

यह वास्तव में एक रचनात्मक विचार है। धन्यवाद! – LoungeKatt

7

वहाँ एक है प्रतिबिंब के माध्यम से ऐसा करने का तरीका।

+0

यह ठीक काम कर रहा है। –

3

sources के अनुसार Activity.setTheme Activity.onCreate से पहले कहा जाता है [गैर सरकारी apis के बारे में सम्मिलित अस्वीकरण यहाँ]

int themeResId = 0; 
try { 
    Class<?> clazz = ContextThemeWrapper.class; 
    Method method = clazz.getMethod("getThemeResId"); 
    method.setAccessible(true); 
    themeResId = (Integer) method.invoke(this); 
} catch (NoSuchMethodException e) { 
    Log.e(TAG, "Failed to get theme resource ID", e); 
} catch (IllegalAccessException e) { 
    Log.e(TAG, "Failed to get theme resource ID", e); 
} catch (IllegalArgumentException e) { 
    Log.e(TAG, "Failed to get theme resource ID", e); 
} catch (InvocationTargetException e) { 
    Log.e(TAG, "Failed to get theme resource ID", e); 
} 
// use themeResId ... 

है, तो आप themeId जब एंड्रॉयड यह सेट बचा सकते हैं: अपनी गतिविधि में इस रखो :

public class MainActivity extends Activity { 
    private int themeId; 

    @Override 
    public void setTheme(int themeId) { 
     super.setTheme(themeId); 
     this.themeId = themeId; 
    } 

    public int getThemeId() { 
     return themeId; 
    } 
} 
संबंधित मुद्दे