2010-05-18 8 views
43

जब मैं वरीयता गतिविधि बनाता हूं तो मैं xml फ़ाइल में सभी वरीयताओं को परिभाषित करता हूं। प्रत्येक वरीयता में इस एक्सएमएल में एक कुंजी परिभाषित की गई है। लेकिन जब मैं वरीयता का उपयोग मैं लिखने:एंड्रॉइड वरीयता कुंजी कहां स्टोर करें?

SharedPreferences appPreferences = PreferenceManager.getDefaultSharedPreferences(this); 
boolean foo_value = appPreferences.getBoolean("foo_key_defined_in_xml", false); 

वहाँ किसी भी तरह से हार्ड-कोडेड रास्ते में "foo_key_defined_in_xml" संदर्भित से बचने के लिए है? शायद आर शैली के तरीके में संदर्भित करने की संभावना है (स्ट्रिंग को संदर्भित नहीं करने के लिए)?

उत्तर

59

मैंने पाया है कि यह strings.xml में कुंजी की दुकान और सिर्फ अन्य सभी मूल्यों android:key="@string/preference_enable" तरह preferences.xml से उन्हें करना संभव है।

कोड में आप getString(R.string.preference_enable)

टाइप करके कुंजी का उल्लेख कर सकते आप चिह्नित कर सकते हैं स्ट्रिंग एक <xliff:g> टैग का उपयोग कर अनुवाद नहीं किया जा करने के लिए। देखें Localization Checklist

<string name="preference_enable"><xliff:g id="preference_key">enable</xliff:g></string> 
+1

यह सबसे अच्छा तरीका है क्योंकि यह आपको एक ही स्थान पर कुंजी बदलने के लिए और यह दोनों सेटिंग पृष्ठ पर प्रचार करेंगे और कहीं भी आप कोड में इसे संदर्भ अनुमति देता है। –

+5

मैं इस वजह से के खिलाफ सलाह देंगे जब आप एक से अधिक भाषा एक्सएमएल फ़ाइलों का समर्थन, कुंजी स्ट्रिंग inadvertantly भी अनुवाद किया जा सकता है। –

+16

ठीक है, आप जो केवल स्थिर मूल्यों और कोई अनुवाद हैं एक अलग फाइल में उन कुंजियों को बचाने चाहिए। – Hameno

0

जहां तक ​​मुझे पता है कि वरीयता कुंजियों को संदर्भित करने का कोई बेहतर तरीका नहीं है (कक्षा से स्ट्रिंग को स्टोर करने के लिए शायद एक स्थिर अंतिम स्ट्रिंग का उपयोग करके)।

example एसडीके डॉक्स में दी गई है कि आप अपने उदाहरण में दिया है के रूप में ही होता है,

+0

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

1

प्रयास करें getString(R.string.key_defined_in_xml)

+0

काम नहीं करता है। 'Android: key' से मान इस वर्ग में संग्रहीत नहीं हैं। – scai

1

क्या GetString को छिपाने के लिए एक सहायक वर्ग का उपयोग कर के बारे में() - सहायक एक बार प्रत्येक गतिविधि या सेवा में दृष्टांत।

class Pref { 

    final String smsEnable_pref; 
    final String interval_pref; 
    final String sendTo_pref; 
    final String customTemplate_pref; 
    final String webUrl_pref; 

    Pref(Resources res) {  
     smsEnable_pref = res.getString(R.string.smsEnable_pref); 
     interval_pref = res.getString(R.string.interval_pref); 
     sendTo_pref = res.getString(R.string.sendTo_pref); 
     customTemplate_pref = res.getString(R.string.customTemplate_pref); 
     webUrl_pref = res.getString(R.string.webUrl_pref); 
    } 
} 
+0

के बारे में भ्रमित के लिए पढ़ने का सुझाव मुझे यकीन है कि क्या ddcruver साधन नहीं कर रहा हूँ __Even से यदि आप /res/values/string.xml इस कुंजी का नाम आपको लगता है कि उपयोग नहीं कर सकते एंड्रॉयड में धारण करने के लिए एक Resoure को परिभाषित: key = "KEY_NAME" .__ पिक्सेल के रूप में लिखा है, आप एंड्रॉयड कर सकते हैं: key = "@ स्ट्रिंग/preference_key "। शायद मुझे कुछ याद आ रही है। –

7

आप "res/values" में एक "keys.xml" फ़ाइलें इस्तेमाल कर सकते हैं, लेकिन कुछ इस तरह इस तरह से आप न समस्या नहीं होनी चाहिए जब आप एक से अधिक भाषाओं का उपयोग कर रहे रखना चाहिए,:

उदाहरण के लिए
<resources 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:ignore="MissingTranslation"> 

    <string name="key1">key1</string> 
    <string name="key2">key2</string> 
... 
</resources> 

तो फिर तुम यह xml में एक सामान्य स्ट्रिंग की तरह संदर्भ सकता है:

.... 
android:key="@string/key1" 
.... 

या उदाहरण के लिए अपने जावा कोड में:

SwitchPreference Pref1= (SwitchPreference) getPreferenceScreen().findPreference(getString(R.string.key1)); 
+2

मुझे स्वीकार्य उत्तर से बेहतर पसंद है क्योंकि यह क्लीनर है (और वास्तव में उस उत्तर में टिप्पणियों में सुझाव दिया गया है)। हां, "स्ट्रिंग /" नामस्थान अभी भी वास्तविक तारों और वरीयता कुंजी दोनों के साथ प्रदूषित हो जाएगा - इसे कुछ हद तक हल करने के लिए उपसर्ग का उपयोग करना होगा। –

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

  • कोई संबंधित समस्या नहीं^_^