2013-11-04 6 views
10

मैंने एक द्विभाषी (दो भाषाओं के साथ) एंड्रॉइड एप्लिकेशन बनाया है। मैं दो फ़ाइलों में अपने संसाधन तार डाला है:स्क्रीन रोटेशन के बाद, मेरे आवेदन की भाषा बदल दी जाएगी

For Persian language (default) 
values/strings_locale.xml‬ 

For English language 
values-en/strings_locale.xml‬ 

मैं अपनी पहली शुरूआत गतिविधि मैं निम्नलिखित कोड डाला है:

Configuration c = new Configuration(this.getResources().getConfiguration()); 
c.locale = new Locale("fa_IR"); 

this.getResources().updateConfiguration(c, this.getResources().getDisplayMetrics()); 

तो इस कोड के बाद, मेरे डिफ़ॉल्ट भाषा फारसी और के सभी हो जाएगा सभी गतिविधियों में तारों को फारसी भाषा में सही तरीके से दिखाया गया है।

लेकिन समस्या तब होती है जब डिवाइस की स्क्रीन घुमाया जाता है, सभी तार अंग्रेजी में दिखाए जाते हैं और यह अन्य सभी गतिविधियों के लिए भी होता है! और मुझे अपने आवेदन को बंद करना और फिर से खोलना है।

ऐसा क्यों होता है और मैं इस समस्या को कैसे हल कर सकता हूं?

+1

चेक [इस दस्तावेज़] (http://developer.android.com/guide/components/activities.html), जब रोटेशन के बाद गतिविधि को फिर से बनाया जाता है, ऊपर दिया गया कोड शायद फिर से नहीं चलाया जाता है ... सुनिश्चित करें कि आप उस स्थान पर कोड डाल दें जहां इसे घूर्णन के बाद फिर से संसाधित किया जा सके। – Mikel

उत्तर

23

आप कक्षा बना सकते हैं जो Application फैलाता है। वहां आप एक विधि को ओवरराइड कर सकते हैं जिसे हर बार कॉन्फ़िगरेशन बदलते हैं (उदाहरण के लिए जब स्क्रीन अभिविन्यास बदल जाता है)।

कुछ की तरह:

public class MyApplication extends Application { 
    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     setLocale(); 
    } 

    private void setLocale() { 
     Locale locale = new Locale("fa_IR"); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     getBaseContext().getResources().updateConfiguration(config, 
       getBaseContext().getResources().getDisplayMetrics()); 
    } 
} 

और न प्रकट में यह घोषणा करने के लिए भूल जाते हैं: example of Application class

AndroidManifest.xml में:

<application 
    android:name="com.blaablaa.bumbam.MyApplication" 
    ... 
+0

धन्यवाद! बहुत अच्छा समाधान! – breceivemail

0

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

यदि आप अपने कोड के साथ उस भाषा से स्वतंत्र भाषा सेट करना चाहते हैं - जो मैं अनुशंसा नहीं करता - तो शायद आपके जीवन चक्र के साथ एक समस्या है जो आपके कोड को अभिविन्यास परिवर्तन के बाद फिर से चलाने से रोकती है। यदि आप अपना अधिक कोड पोस्ट करते हैं तो मैं आपकी मदद कर सकता हूं।

+1

यह संभव है। यदि आपने अपनी पहली गतिविधि में उल्लिखित कोड डाला है, तो आपकी सभी गतिविधियां उस भाषा में दिखाई देंगी। आप इसका परीक्षण कर सकते हैं। मेरी समस्या यह है कि जब मैं डिवाइस को घुमाता हूं उदाहरण के लिए तीसरी गतिविधि, मेरे आवेदन की पूरी गतिविधियों की भाषा बदल जाती है। – breceivemail

+0

मुझे पता है कि यह संभव है। मैं बस इतना कह रहा हूं कि आपको यह नहीं करना चाहिए। लेकिन अगर आप अभी भी मुझे मदद करना चाहते हैं, तो आपको अपना अधिक कोड पोस्ट करना होगा। –

0

आप कस्टम ContextWrapper

बना सकते हैं
public class mContextWrapper extends ContextWrapper { 
    public mContextWrapper(Context base){ 
     super(base); 
    } 

    @SuppressWarnings("deprecation") 
    public static ContextWrapper wrap(Context context, String language) { 
     Configuration config = context.getResources().getConfiguration(); 
     Locale sysLocale = null; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
      sysLocale = getSystemLocale(config); 
     } else { 
      sysLocale = getSystemLocaleLegacy(config); 
     } 
     if (!language.equals("") && !sysLocale.getLanguage().equals(language)) { 
      Locale locale = new Locale(language); 
      Locale.setDefault(locale); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
       setSystemLocale(config, locale); 
      } else { 
       setSystemLocaleLegacy(config, locale); 
      } 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
       context = context.createConfigurationContext(config); 
      } else { 
       context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); 
      } 
     } 
     return new mContextWrapper(context); 
    } 

    @SuppressWarnings("deprecation") 
    public static Locale getSystemLocaleLegacy(Configuration config){ 
     return config.locale; 
    } 

    @TargetApi(Build.VERSION_CODES.N) 
    public static Locale getSystemLocale(Configuration config){ 
     return config.getLocales().get(0); 
    } 

    @SuppressWarnings("deprecation") 
    public static void setSystemLocaleLegacy(Configuration config, Locale locale){ 
     config.locale = locale; 
    } 

    @TargetApi(Build.VERSION_CODES.N) 
    public static void setSystemLocale(Configuration config, Locale locale){ 
     config.setLocale(locale); 
    } 
} 

और अपनी गतिविधि attachBaseContext में अपने कस्टम देते ContextWrapper

@Override 
    protected void attachBaseContext(Context newBase) { 
     globalClass = (YouAppClass)newBase.getApplicationContext(); 
     //try geting the lang you have setted inside your YouAppClass class 
     // or you can use shared preferences for it 
     //pref = PreferenceManager.getDefaultSharedPreferences(newBase) 
     lang=globalClass .getLang(); 
     super.attachBaseContext(mContextWrapper.wrap(newBase,lang)); 
    } 
संबंधित मुद्दे