2013-08-21 9 views
5

मैं चाहता हूं कि मेरी भाषा गतिशील रूप से बदल जाए और मैं कॉन्फ़िगरेशन पर उपयोग करने की कोशिश कर रहा हूं लेकिन इसे नहीं कहा जा रहा है। मेरे पास मुख्य एक्टिविटी है जो मेरी एक्शन बार और व्यूअरजर बनाता है। मेरे बाकी के पेज टुकड़े हैं। मेरी सेटिंग्सफ्रेगमेंट में मेरे पास भाषा को फ्रेंच में स्विच करने के लिए एक बटन है।लोकेल: ऑन कॉन्फ़िगरेशन चेंज नहीं किया गया

langChange.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View vi) { 
      MainActivity main = (MainActivity)getActivity(); 
      main.langChange(); 
     } 

}); 

तब मेरे MainActivity में मैं

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 
    if (locale != null){ 
     newConfig.locale = locale; 
     Locale.setDefault(locale); 
     getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics()); 
    } 
} 

public void langChange(){ 
    if(currentLanguage == FRENCH_LANGUAGE){ 
     locale = new Locale("en"); 
     Locale.setDefault(locale); 
     Configuration c = getBaseContext().getResources().getConfiguration(); 
     c.locale = locale; 
     getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics()); 
     currentLanguage = "English"; 
    } 
    else if(currentLanguage == ENGLISH_LANGUAGE){ 
     locale = new Locale("fr"); 
     Locale.setDefault(locale); 
     Configuration c = getBaseContext().getResources().getConfiguration(); 
     c.locale = locale; 
     getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics()); 
     currentLanguage = "French"; 
    } 
    actionBar.setSelectedNavigationItem(actionBar.getTabCount() - 1); //This just puts it back to the settings tab 
} 

onConfigurationChanged नहीं बुलाया जा रहा है। मेरी प्रकट में मेरे पास है:

<activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="locale"></activity> 

मैं इनमें से एक या विकल्पों में से सभी में कोई सफलता के साथ orientation|keyboardHidden|screenSize जोड़ने की कोशिश की है।

इसका कारण यह है कि मैं बटन क्लिक करने के बाद एक्शनबार टेक्स्ट और अन्य सभी टेक्स्ट को बदलना चाहता हूं। मेरे पास फ्रेंच के लिए एक अलग तार फ़ाइल है।

कोई भी मदद महान होगी।

+0

आप कैसे जानते हैं कि 'ऑन कॉन्फ़िगरेशन चेंज' को नहीं कहा जाता है? आपके पास विधि के अंदर कोड के चारों ओर 'शून्य' के लिए एक चेक है, जो संभवतः समस्या हो सकती है। इसके अलावा इस प्रश्न पर एक नज़र डालें: http://stackoverflow.com/questions/6457659/android-onconfigurationchanged-not-being-called – Darwind

+0

मैंने 'log.d' के साथ पहले कथन के पहले और बाद में ब्रेकपॉइंट जोड़े। मुझे पता है कि यह इस विधि को नहीं मारा है। मैंने ऊपर दिए गए प्रश्न को भी देखा है और वे उत्तर मेरे मुद्दे को हल नहीं करते हैं – BigT

उत्तर

4

ठीक है, मैंने इसे थोड़ा सा देखा है।

मुझे यकीन नहीं है, onConfigurationChanged विधि क्यों नहीं कहा जाता है, इसलिए मुझे उम्मीद है कि कोई इस भाग पर हमें प्रबुद्ध कर सकता है।

मेरी खोज में मैंने इस tutorial पर ठोकर खाई, जो वास्तव में कॉन्फ़िगरेशन को बदलकर Locale को बदलती है।

आपका कोड लग रहा है इस ट्यूटोरियल की तरह एक बहुत वास्तव में ;-)

फिर भी, ट्यूटोरियल और कोड के बारे में महत्वपूर्ण बात यह है इस विधि है:

private void updateTexts() { 
    txt_hello.setText(R.string.hello_world); 
    btn_en.setText(R.string.btn_en); 
    btn_ru.setText(R.string.btn_ru); 
    btn_fr.setText(R.string.btn_fr); 
    btn_de.setText(R.string.btn_de); 
} 

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

जब यह किया जाता है, तो ऐप विशिष्ट लोकल फ़ोल्डर से स्ट्रिंग लोड करेगा।

क्यों एंड्रॉयड इस तरह से बर्ताव करता है का जवाब, Activity के लिए official documentation में पाया जा सकता कह रही:

[...]

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

पुरुष ट्यूटोरियल लिख डाउनलोड के रूप में पूरे ट्यूटोरियल परियोजना को जोड़ने के लिए तरह पर्याप्त था, तो मैं आप को देखने के लिए कि यह कैसे काम कर रहा है और उसे देखें सुझाव देते हैं, क्योंकि यह काम कर रहा है ;-) आप onConfigurationChanged outcomment कर सकते हैं विधि, क्योंकि यह कुछ भी नहीं कर रहा प्रतीत होता है।

उम्मीद है कि इससे मदद मिलती है।

+0

आप इसे खोजने के लिए एक देवता हैं। ये बिलकुल सही है। मेरे कोड के चारों ओर फिट करने के लिए मुझे कुछ बदलाव करना है लेकिन पूरी तरह से काम करता है !!!! धन्यवाद – BigT

+0

किसी भी समय - मुझे चारों ओर खोदना पसंद है ;-) – Darwind

6

आपको एंड्रॉइड को परिभाषित करना है: कॉन्फ़िगरेशन = "लेआउट डायरेक्शन | लोकेल" ऑन कॉन्फ़िगरेशन चेंज() को कॉल करने के लिए।

+0

यह वास्तव में –

+3

काम नहीं करता है, वह पूरी तरह से सही है, बिना 'लेआउट डायरेक्शन' कार्यों को जोड़ता है। – marco

+0

यह मेरे लिए भी काम करता था, क्या आपको पता था कि उसके पीछे की पृष्ठभूमि क्या है? –

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