Cambiar la configuración de Android en el cambio de orientación

En mi aplicación estoy teniendo dos actividades uno es giratorio a ambos lados y otro está bloqueado en modo de paisaje.

A continuación se muestran mis detalles de archivo de manifiesto donde se agregaron las actividades

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

En mi actividad de inicio de sesión usando una ruleta estoy cambiando la configuración regional y la actualización completa de textos de edición y texto de botones. En un botón haga clic en la acción que estoy actualizando las vistas de la interfaz de usuario y ese momento cuando rota el dispositivo, la configuración regional de Inglés se establece en las vistas que se actualizan Aquí está mi código completo

 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()); } } } 

Si te entiendo correctamente, el problema es que la configuración regional del teléfono se restaura al cambiar la orientación de la pantalla, a pesar de que tienes android:configChanges="orientation|screenSize|keyboardHidden" , en tu AndroidManifest.xml . Si estuviera en ti me acercaría al tema desde una perspectiva diferente. Me deshacería del android:configChanges , dejando que android hiciera su trabajo reiniciando la Actividad, cuando cambie la orientación. Entonces usaría el par onSaveInstanceState , para guardar y el Locale el usuario seleccionado en el Spinner . Cuando onCreate se llama de nuevo y se sabe que se llama debido al cambio de orientación porque el paquete no es nulo, lea la configuración Locale y reinicie y actualice la configuración nuevamente. P.ej

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

Aún tienes la solución. Simplemente establezca la configuración regional guardada. En la 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 vez usted necesita para quitar android:configChanges y su método correspondiente.

Creo que debe poner código siguiente cuando la orientación fija de la actividad particular en el archivo menifest:

 <activity android:name="Your activity which is loked" android:configChanges="orientation" android:screenOrientation="landscap" ></activity> 
  • Guardar TextView con onSaveInstanceState
  • Centrar una imagen de fondo en Android
  • Comportamiento extraño con el sensor de orientación de Android
  • El video de Android no mantiene la orientación cuando se sube al sitio web.
  • ¿Cómo puedo bloquear el diseño de mi programa Android a una orientación
  • Diseño diferente para la orientación "Paisaje" y "Orientación horizontal"
  • El diseño de Xml cambia al cambiar la orientación
  • Problema del ciclo de vida con cambio de orientación en otra actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.