2010-04-11 11 views
25

हाय सब मैं इस तरह मैनिफ़ेस्ट फ़ाइल में विषय की स्थापना की है:PreferenceActivity और विषय आवेदन नहीं

android:theme="@android:style/Theme.Light" 

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

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceScreen 
     android:title="@string/account"> 
     <CheckBoxPreference 
      android:key="enable_account" 
      android:title="@string/account_use" 
      android:summary="@string/account_summ" /> 
     <EditTextPreference 
      android:key="username" 
      android:title="@string/login" 
      android:dependency="enable_account" 
      android:summary="@string/login_summ" /> 
     <EditTextPreference 
      android:key="password" 
      android:title="@string/password" 
      android:dependency="enable_account" 
      android:summary="@string/password_summ" 
      android:password="true" /> 
    </PreferenceScreen> 

और एक स्क्रीनशॉट है:: यहाँ वरीयताओं xml फ़ाइल के कोड का हिस्सा है

alt text http://i39.tinypic.com/16hnhh3.png

किसी भी समाधान?

+0

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

+0

महान विचार! धन्यवाद। अगर उत्तर एक टिप्पणी थी तो अब मैं इस प्रश्न का उत्तर कैसे दे सकता हूं? –

उत्तर

15

किसी ने सिर्फ http://code.google.com/p/android/issues/detail?id=4611

पर एक समाधान तैनात संक्षेप में देखें, शीर्ष स्तर वरीयता स्क्रीन विषय लेकिन नेस्टेड वाले नहीं पहचान करने के लिए लग रहे हैं। तो वैकल्पिक हल नेस्ट PreferenceScreen के लिए शीर्ष स्तर PreferenceActivity बनाने की सिफारिश और फिर आशय के माध्यम से इस नई गतिविधि लागू:

<PreferenceScreen android:key="key1" 
         android:title="1 Item" 
         android:summary=""> 
     <intent android:action="android.intent.action.VIEW" 
       android:targetPackage="com.example" 
       android:targetClass="com.example.PreferenceActivity2"/> 
</PreferenceScreen> 

मैं कुछ भी लेकिन आवेदन ही विषय को लागू करने के भी नहीं था।

+5

उत्तर में दिए गए लिंक को चेक करें, अब एक आसान समाधान है, टिप्पणी देखें 35 – powder366

+0

इन दोनों कामकाजों की तुलना में एक और समाधान भी आसान है; मेरा जवाब http://stackoverflow.com/a/25613182/231078 देखें। – Joe

+0

वास्तव में @ जो – Ewoks

3

अंत में मैं पता चला (जावा कोड के माध्यम से)

"PreferenceActivity" के विषय बदल कैसे प्रोग्राम के रूप में विषय बदलने के लिए सिर्फ इस तरह कार्य करें:

 @Override 
     public void onCreate(Bundle savedInstanceState) { 
     setTheme(R.style.Holo_Theme_Light); 
     super.onCreate(savedInstanceState); 
     } 

हमेशा super.onCreate(savedInstanceState); विधि से पहले setTheme(R.style.yourtheme); विधि कॉल। ऐसा करके यह परिणाम दिखाएगा जैसा कि नीचे दिखाया गया है।

enter image description here

सब है कि।

यदि विधि super.onCreate(savedInstanceState); विधि के बाद विधि नीचे दिखाए गए परिणाम का उत्पादन करेगी।

enter image description here

नोट: विषय-वस्तु नेस्ट PreferenceScreen से पहचान नहीं कर रहे हैं। उस नेस्टेड वरीयता स्क्रीन पर थीम लागू करने के लिए आपको उस नेस्टेड वरीयता स्क्रीन के लिए एक और वरीयता सक्रियता बनाना है और setTheme(R.style.yourtheme); विधि पर कॉल करें।

+0

यह अधिक नहीं होना चाहिए था। – faraday

+0

हाँ, मैं सहमत हूं! मैं पुष्टि कर सकता हूं कि यह काम करता है और यह सबसे आसान समाधान है! –

4

तुम भी आंतरिक वरीयता स्क्रीन की शैलियों को ओवरराइड करने के लिए इस तकनीक का उपयोग कर सकते हैं:

इस कोड को क्लिक किए गए वरीयता स्क्रीन करने के लिए मुख्य वरीयता स्क्रीन की शैली लागू होता है।

+0

धन्यवाद !!! ... यह समाधान मेरे लिए काम किया। – user836026

+0

आपका स्वागत है! :) – webmaster

+0

जिसने मेरी समस्या को रेशम के रूप में चिकनी हल किया! धन्यवाद! – aveschini

0

यदि आप इसे पूरा करने के लिए काले जादू की तरह दिखने के ठीक हैं, तो एक आसान समाधान भी है ...

PreferenceScreen#showDialog(Bundle) के स्रोत को देखते हुए, हम देखते हैं कि संवाद mContext.getThemeResId() के माध्यम से प्राप्त विषय संसाधन का उपयोग करके बनाया गया है, जिसका उपयोग ContextThemeWrapper में किया जाता है।

यह हमें काफी हद तक मदद कर सकते हैं, क्योंकि ContextPreferenceScreen में इस्तेमाल किया जा रहा वास्तव में हमारे PreferenceActivity है, इसलिए हम सभी क्या करना है ओवरराइड getThemeResId() विधि (जो सार्वजनिक एपीआई से छिपा हुआ है), हमारे कस्टम विषय प्रदान करना है, और सब-वरीयता स्क्रीन अब जो भी कस्टम थीम संसाधन चाहता है उसका उपयोग करता है!

/** 
* This is a hack to provide our own theme for the PreferenceScreen's dialog. 
* 
* @see android.preference.PreferenceScreen#showDialog(Bundle) 
*/ 
public int getThemeResId() { 
    return R.style.Theme_MyApp_PreferenceScreen; 
} 

ध्यान दें कि क्योंकि इस प्रक्रिया में @hide साथ टिप्पणी की जाती है, हम @Override एनोटेशन कि आम तौर पर इस मामले में इस्तेमाल किया जाएगा का उपयोग नहीं कर सकते हैं; और हम super.getThemeResId() विधि पर भी कॉल नहीं कर सकते हैं।

 try { 
      ((Object) this).getClass().getMethod("getThemeResId").invoke(this); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } 
+0

काम नहीं करता ... क्या आप एक और पूरा उदाहरण प्रदान कर सकते हैं? –

+0

प्रतिबिंब लगभग हमेशा गंदा नहीं है दीर्घकालिक समाधान। – Ewoks

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