2010-08-02 18 views
5

मैं भाषा (एप्लिकेशन का लोकेल) प्रोग्रामेटिक रूप से बदलना चाहता हूं।एंड्रॉइड और मेनू स्थानीयकरण

मेरे लिए मुख्य समस्या मेनू लेबल अपडेट कर रही है।

मैंने कोशिश की निम्न विधि:

@Override 
public boolean onMenuOpened(int featureId, Menu menu) { 
    if (shouldChangeMenuLabels) { 
     for (int i = 0; i < menu.size(); i++) { 
      MenuItem menuItem = menu.getItem(i); 
      switch (menuItem.getItemId()) { 
       case R.id.menu_main_about: 
        menuItem.setTitle(R.string.menu_about); 
        break; 
       case R.id.menu_main_preferences: 
        menuItem.setTitle(R.string.menu_prefs); 
        break; 
      } 
     } 
     shouldChangeMenuLabels = false; 
    } 

लेकिन मुझे यकीन है कि यह बुरा विचार। मैं स्विच-केस स्टेटमेंट का उपयोग करने से बचना चाहता हूं क्योंकि यह सार्वभौमिक विधि नहीं है (मैं बस अन्य गतिविधियों में फंस नहीं सकता/मैं अमूर्त वर्ग नहीं कर सकता जो ऐसा करेगा)।


Btw, सभी मेनू मेनू/*। Xml फ़ाइलें में वर्णित किया गया है तो मैं कोड को डुप्लिकेट नहीं करना चाहती। किसी के पास विचार हैं?

पहले जवाब देने के लिए चिंतित: मैं निम्न कोड के साथ वातावरण बदल hae:

  Locale locale = new Locale((String)newValue); 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(); 
      config.locale = locale; 
      getApplication().getResources().updateConfiguration(config, getApplication().getResources().getDisplayMetrics()); 

लेकिन जैसा कि मैंने प्रत्येक गतिविधि के लिए घूर्णन नियंत्रित करना चाहते हैं, वे समाप्त हो गया कभी नहीं कर रहे हैं। शायद मैंने कुछ गलत किया?

उत्तर

5

मैं नहीं जानता कि यह एक अच्छा विचार है, लेकिन मैं निम्नलिखित तरीका मिल गया है:

@Override 
public boolean onMenuOpened(int featureId, Menu menu) { 
    if (shouldChangeLocale) { 
     menu.clear(); 
     MenuInflater inflater = getMenuInflater(); // -->onCreateMenu (Menu) 
     inflater.inflate(R.menu.menu_main, menu); ///
     shouldChangeLocale=false; 
    } 

    return super.onMenuOpened(featureId, menu); 
} 

मैं आपकी सलाह की जरूरत है, मैं इस तरह के इस तरह से करना चाहिए?

0

क्या आपने Android Localization पर प्रलेखन के माध्यम से पढ़ा है? आम तौर पर आप प्रत्येक भाषा/लोकेल के लिए एक अलग स्ट्रिंग फ़ाइल बनाते हैं जिसे आप समर्थन देना चाहते हैं। अपनी menu.xml फ़ाइल में आप स्ट्रिंग आईडी का संदर्भ दे सकते हैं, और उचित मान वर्तमान लोकेल सेटिंग्स के आधार पर चुना जाएगा।

+0

मैंने यह किया। (मेरा मतलब है मूल्य-xx/string.xml और मान/string.xml)। क्या आपका मतलब मेनू-एक्सएक्स/mymenu.xml बनाना है? – davs

+0

तो आपके पास स्ट्रिंग, menu_about, और मान-yy/string.xml के साथ स्ट्रिंग, menu_about के साथ मान-xx/string.xml है। आपने अपने फोन के लोकेल को वाई के लिए सेट किया है, और स्ट्रिंग वैल्यू वाई में बदल नहीं है? आप किस लोकल के साथ परीक्षण कर रहे हैं? http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch इस बात के बारे में वार्ता करता है कि यह किस मूल्य का उपयोग करने का निर्णय लेता है, हो सकता है कि आपके लोकेल को सही तरीके से कॉन्फ़िगर नहीं किया गया हो। –

+0

मैं एन/आरयू लोकेशंस के साथ परीक्षण कर रहा हूं। लेकिन जैसा कि मैंने गतिविधियों को नष्ट नहीं किया है, मेनू अद्यतन नहीं किया गया है। इसलिए, मैंने मेनू साफ़ करने और स्क्रैच – davs

0

menu.add (0, MENU_ABOUT, 0, _mContext.getResources() GetString (R.string.mymenu)।) SetIcon (R.drawable.ic_menu)।

मेनू डालने के दौरान आप स्ट्रिंग और इसे स्थानीयकृत करते हैं।

+0

की आवश्यकता होने पर मेनू को रीफ्रेश करने की आवश्यकता है क्योंकि मुझे पता है कि मेन्यू प्रत्येक गतिविधि के लिए केवल अपने जीवन चक्र के कारण ही बनाता है। मुझे बनाने के कारण स्थानीयकरण के साथ कोई समस्या नहीं है ..मेनू में बनाया गया है जब मुझे समस्या है, तो मैंने एप्लिकेशन के लोकेल को बदल दिया है और मैं मेनू को फिर से लोड करना चाहता हूं (शायद इसे नष्ट कर दूं और इसे फिर से बनाएं। लेकिन मुझे नहीं पता कि इसे कैसे नष्ट किया जाए) – davs

+0

आप साझा वरीयता का उपयोग कर सकते हैं और अपने मेनू आइटम में से प्रत्येक के चयन पर इसे बदल \t \t अगर (preferences.getBoolean ("ध्वनि", true)) \t \t { \t \t \t \t \t menu.add (0, MENU_SOUND, 0, "ध्वनि") .setIcon (R.drawable.on); \t \t} \t बाकी \t \t \t { \t \t menu.add (0, MENU_SOUND, 0, "ध्वनि") setIcon (R.drawable.off)। \t \t \t \t \t} – Eby

+0

मैं इस तरह से मेनू बनाना नहीं चाहता क्योंकि मुझे विश्वास है कि यह एक बुरा अभ्यास है – davs

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