2015-05-08 33 views
5

w mojej aplikacji Mam dwie czynności, jedna jest obrotowa dla obu stron, a druga jest zablokowana w trybie poziomym.zmiana lokalizacji w Androidzie w zmianie orientacji

Poniżej moje manifestu pliku których działania zostały dodane

<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> 

w mojej działalności logowania za pomocą pokrętła jestem zmieniając ustawienia regionalne i aktualizowania całych tekstów i edycji tekstu przycisków. W działaniu przycisk click jestem aktualizowania poglądy UI i ten czas, kiedy obrócić urządzenie, locale angielski jest ustawiony na widoki, które są uaktualnione Oto mój cały kod

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

Z jakiego systemu operacyjnego Android korzystasz? – Mithun

+0

Android Kitkat i Lollypop –

Odpowiedz

3

Jeśli ja zrozumiałem, Problem polega na tym, że ustawienia regionalne telefonu są przywracane po zmianie orientacji ekranu, pomimo, że masz android:configChanges="orientation|screenSize|keyboardHidden", w swoim AndroidManifest.xml. Gdybym był w tobie, podchodziłbym do problemu z innej perspektywy. Pozbyłbym się android:configChanges, pozwalając androidowi na ponowne uruchomienie działania, gdy orientacja się zmieni. Chciałbym następnie użyć pary onSaveInstanceState, aby zapisać i Locale użytkownika wybranego w Spinner. Po ponownym wywołaniu onCreate, a wiesz, że jest wywoływana ze względu na zmianę orientacji, ponieważ pakiet nie jest pusty, przeczytaj zapisany i ponownie uruchomiony Locale i ponownie zaktualizuj konfigurację. Na przykład.

@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

myślę, że należy umieścić następujący kod gdy stała orientacja danej działalności w pliku manifestu:

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

Próbowałem tego samego, ale bez użycia –

1

Nadal masz rozwiązanie. po prostu ustaw zapisane ustawienia regionalne. w 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); 
    .... 

może trzeba usunąć android:configChanges i odpowiadający mu sposób.