2015-05-08 17 views
5

मेरे ऐप में मेरे पास दो गतिविधियां हैं जो दोनों तरफ घूमने योग्य है और अन्य लैंडस्केप मोड में बंद है।अभिविन्यास परिवर्तन में एंड्रॉइड लोकेल परिवर्तन

के बाद मेरी मैनिफ़ेस्ट फ़ाइल विवरण जहां गतिविधियों अपना लॉगिन गतिविधि में

<activity 
    android:name="com.hogaming.android.Activities.LoginActivity" 
    android:configChanges="orientation|screenSize|keyboardHidden"> 
</activity> 

<activity 
    android:name="com.android.activities.MainActivity" 
    android:configChanges="orientation|screenSize|keyboardHidden"> 
</activity> 

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

public class LoginActivity extends Activity 
{ 
    Locale locale = null; 
    Spinner langSpinner; 
    private SharedPreferences langPrefs; 
    String langSelected = ""; 
    int langPosition = 0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.loginscreen); 

     langPrefs = PreferenceManager.getDefaultSharedPreferences(this); 
     langSelected = langPrefs.getString(langPrefKey, ""); 
     langPosition = langPrefs.getInt(langPosKey, 0); 

     langSpinner = (Spinner)this.findViewById(R.id.lanuage_spinner1); 
     langSpinner.setSelection(langPosition); 
     langSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
     { 
      @Override 
      public void onItemSelected(AdapterView<?> arg0, View arg1, int pos, long arg3) 
      { 
       if (pos == 0) 
       { 
        langSelected ="en"; 
        locale = Locale.ENGLISH; 
       } 
       else if (pos == 1) 
       { 
        langSelected ="it"; 
        locale = Locale.ITALIAN; 
       } 
       else if (pos == 2) 
       { 
        langSelected ="zh"; 
        locale = Locale.SIMPLIFIED_CHINESE; 
       }    
       else if (pos == 3) 
       { 
        langSelected ="zh-rTW"; 
        locale = Locale.TRADITIONAL_CHINESE; 
       } 
       changeLang(langSelected, pos); 
      } 
      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
       // TODO Auto-generated method stub 

      } 
     }); 

     btnLogin = (Button) this.findViewById(R.id.LoginButton); 
     btnLogin.setOnClickListener(new ButtonClickListener()); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     this.finish(); 
    } 

    @Override 
    protected void onDestroy() 
    { 
     super.onDestroy(); 
     this.finish(); 
    } 

    public class ButtonClickListener implements OnClickListener { 
     public void onClick(View v) { 
        final LoginTask validateTask = new LoginTask(context, usernameField.getText().toString(), passwordField.getText().toString()); 
        validateTask.execute(); 
       } 

       // Hide the keyboard 
       InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(passwordField.getWindowToken(), 0); 
    } 

    public class LoginTask extends AsyncTask<Void, Void, String> 
    { 
     protected LoginActivity context; 
     protected Exception exception; 
     private String username; 
     private String password; 

     public LoginTask(LoginActivity context, String uname, String pwd) { 
      this.context = context; 
      this.username = uname; 
      this.password = pwd; 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      try 
      { 
       return HTTPHelper.LoginTaskData(this.context, username, password); 
      } 
      catch (Exception e) 
      { 
       exception = e; 
       Log.e(TAG, "Login Task Error", e); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) 
     { 
      super.onPostExecute(result); 
      Log.e(TAG, "LoginTask: " + result); 
      if (result.equals("true")) 
      { 
       // moves to next activity 
      } 
      else if (result.equals("false")) 
      { 
       //showing an alert textview with selected language text 
      } 
     } 
    } 

    public void changeLang(String lang, int pos) 
    { 
     if (lang.length() != 0) 
     {  
      saveLocale(lang, pos, locale); 
      android.content.res.Configuration config = new android.content.res.Configuration(); 
      config.locale = locale; 
      Locale.setDefault(locale); 
      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
      updateTexts(); 
     } 
    } 

    public void saveLocale(String lang, int pos, Locale locale) 
    { 
     SharedPreferences.Editor editor1 = langPrefs.edit(); 
     editor1.remove(langPrefKey); 
     editor1.remove(langPosKey); 
     editor1.commit(); 

     SharedPreferences.Editor editor = langPrefs.edit(); 
     editor.putString(langPrefKey, lang); 
     editor.putInt(langPosKey, pos); 
     editor.commit(); 

     langSelected = langPrefs.getString(langPrefKey, ""); 
     langPosition = langPrefs.getInt(langPosKey, 0); 
    } 

    private void updateTexts() 
    { 
     // here i will once again set all textview String values, it changes to the selected language 
    } 

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

आप किस एंड्रॉइड ओएस का उपयोग कर रहे हैं? – Mithun

+0

एंड्रॉइड किटकैट और लॉलीपॉप –

उत्तर

3

है घुमाने के लिए, मुद्दा यह है कि जब आप AndroidManifest.xml में android:configChanges="orientation|screenSize|keyboardHidden" रखते हैं, तो स्क्रीन अभिविन्यास स्विच करते समय फ़ोन का लोकेल पुनर्स्थापित किया जाता है। अगर मैं आप में था तो मैं इस मुद्दे पर एक अलग परिप्रेक्ष्य से संपर्क करूंगा। मैं android:configChanges से छुटकारा पाउंगा, जब एंड्रॉइड परिवर्तन बदलता है, तो एंड्रॉइड गतिविधि को पुनरारंभ करने के लिए अपना काम करता है। मैं Spinner में चयनित उपयोगकर्ता को बचाने के लिए और Locale को बचाने के लिए जोड़ी onSaveInstanceState का उपयोग करता हूं। जब onCreate को फिर से बुलाया जाता है, और आपको पता है कि अभिविन्यास परिवर्तन के कारण कहा जाता है क्योंकि बंडल शून्य नहीं है, Locale संग्रहीत और पुनरारंभ करें, और कॉन्फ़िगरेशन को फिर से अपडेट करें। जैसे

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    savedInstanceState.putSerializable("LOCALE", locale); 
    super.onSaveInstanceState(savedInstanceState); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.loginscreen); 
    if (savedInstanceState != null) { 
     locale = (Locale) savedInstanceState.getSerializable("LOCALE"); 
     if (locale != null) { 
      // update the configuration 
     } 
    } 
1

मुझे लगता है कि मैनिफ़ेस्ट फ़ाइल में विशेष गतिविधि की तय उन्मुखीकरण जब आप कोड निम्नलिखित रखना चाहिए:

<activity 
    android:name="Your_Activity" 
    android:configChanges="orientation" 
    android:screenOrientation="landscape" /> 
+0

मैंने कोशिश की है, लेकिन कोई उपयोग नहीं –

1

तुम अब भी समाधान है। बस सहेजे गए लोकेल को सेट करें। onCreate में:

... 
    langPrefs = PreferenceManager.getDefaultSharedPreferences(this); 
    langSelected = langPrefs.getString(langPrefKey, ""); 
    langPosition = langPrefs.getInt(langPosKey, 0); 

    // JUST ADD THIS LINE HERE 
    changeLang(langSelected, langPosition); 
    // no need to check empty langSelected, it handled inside of changeLang as you write. 

    langSpinner = (Spinner)this.findViewById(R.id.lanuage_spinner1); 
    .... 

हो सकता है आप android:configChanges और उसके संगत विधि को दूर करने की जरूरत है।

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