2012-04-13 12 views
13

मैं एक गतिविधि है और onCreate में मैं वरीयताओं से भाषा लोड और इस तरह एक स्थान सेट:एंड्रॉयड स्थान बेतरतीब ढंग से वापस बदल जाता है डिफ़ॉल्ट

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

    String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en"); 
    Locale newLocale = new Locale(lang); 
    Locale.setDefault(newLocale); 

    Configuration config = new Configuration(); 
    config.locale = newLocale; 

    final Resources res = getResources(); 
    res.updateConfiguration(config, res.getDisplayMetrics()); 
} 

मैं भी ओवरराइड onConfigurationChanged

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en"); 
    Locale newLocale = new Locale(lang); 
    Locale.setDefault(newLocale); 

    Configuration config = new Configuration(); 
    config.locale = newLocale; 

    final Resources res = getResources(); 
    res.updateConfiguration(config, res.getDisplayMetrics()); 
} 

मैं एक है FragmentPagerAdapter के साथ ViewPager और एंड्रॉइड 2.3.7 पर तीन टैब। समस्या यह है कि कभी-कभी टैब को स्विच करते समय ऐप का लोकेल वापस अंग्रेजी में वापस आ जाता है, इसलिए यूआई में अब से मिश्रित भाषाएं हैं। मैं हमेशा एडाप्टर की getItem() विधि में टैब के लिए नए टुकड़े बनाते हैं। अगर मैं डिवाइस को घुमाता हूं तो लोकेल फिर से सही होता है।

मैंने एंड्रॉइड डालने की कोशिश की: configChanges = "लोकेल" मैनिफेस्ट में और कॉन्फ़िगरेशन पर ओवरराइड नहीं किया गया(), लेकिन परिणाम वही है।

सबसे बुरी बात यह है कि यह 100% पुनरुत्पादित नहीं है, यह केवल कुछ बार होता है और मेरे पास इसके बारे में उपयोगकर्ताओं से भी रिपोर्ट होती है। एक बार एप्लिकेशन शुरू होने के बाद और यह कुछ टैब स्विच करने के बाद लोकेल को नहीं बदलता है, तो यह बाहर निकलने तक सही ढंग से ठीक होगा।

उत्तर

10

कुछ समय बाद मैंने एक रास्ता निकाला। मेरे लिए काम करने वाला एकमात्र समाधान हमेशा प्रत्येक ब्रॉडकास्ट रिसीवर() (यदि यह कुछ संसाधन लोड करता है) में और प्रत्येक सेवा की शुरुआत में प्रत्येक फ्रैगमेंट के ऑनक्रेट व्यू() में, प्रत्येक एसिटिविटी के ऑन क्रेट() में लोकेल को हमेशा स्थापित करता है। इसके लिए मैंने अपनी मुख्य और केवल गतिविधि में एक स्थिर विधि setLocale() बनाई है। यदि आपके पास और गतिविधियां हैं तो इसे कस्टम एप्लिकेशन क्लास में रखा जा सकता है।

एक आखिरी बात। यहां तक ​​कि यह कुछ समय काम नहीं करता है यदि ऐप डीबगिंग के लिए सीधे आईडीई से शुरू किया गया है। चिंता न करें, यह सामान्य रूप से डिवाइस पर चलने पर (कम से कम मेरे लिए) काम करता है।

public static void setLocale(Context context) { 
    final String lang = PreferenceManager.getDefaultSharedPreferences(context).getString("locale", "en"); 
    final Locale newLocale = new Locale(lang); 
    Locale.setDefault(newLocale); 
    final Configuration config = new Configuration(); 
    config.locale = newLocale; 

    final Resources res = context.getResources(); 
    res.updateConfiguration(config, res.getDisplayMetrics()); 
} 
संबंधित मुद्दे