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
- Cambiar el diseño mientras cambia la orientación en tiempo de ejecución en un fragmento sin volver a crear la vista
- La orientación del paisaje bloqueado en la actividad tablet + se inició cuando el dispositivo en vertical = rotación visible en la pantalla
- Obtener el ángulo del dispositivo mediante la función getOrientation ()
- ¿Cómo mantener una imagen en una actividad de Android durante un cambio de orientación?
- A veces no obtiene la devolución de llamada onCreateLoader después de llamar a initLoader
<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()); } } }
- Android - SensorManager comportamiento extraño de getOrientation
- ¿Cómo se utilizan los valores de android.graphics.Matrix?
- ¿La orientación de Android como dirección - rollo de tono de corrupción?
- Bloquear la orientación del dispositivo - React Native (Android)
- La orientación de la pantalla de Android difiere entre los dispositivos
- El diseño de la vista no se actualiza en el cambio de orientación en android
- ¿Cómo hago girar la versión preliminar de vídeo de la versión de libstreaming?
- Cómo ajustar la página web al ancho de la webview cuando se cambia el tamaño de la vista web (sin recargar)
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>
- Ingresar usando Google+ en Parse
- ¿Hay algún evento disparado cuando Android View se vuelve visible en la aplicación?