Actualizar todos los recursos de las Activities

1,062 views
Skip to first unread message

Javier Hernández

unread,
Oct 27, 2011, 8:43:23 AM10/27/11
to desarrolladores-android
Hola,

Tengo una aplicación en varios idiomas, el idioma cambia según la
configuración del terminal.

Pero además, en las preferencias de mi app, en una PreferenceActivity
he añadido un menú para que el usuario pueda cambiar el idioma
explícitamente.

Bueno, esto "funciona"

///////////////////////////// Código
Java //////////////////////////////////////////////////////

private Preference.OnPreferenceClickListener prefClick = new
Preference.OnPreferenceClickListener() {

@Override
public boolean onPreferenceClick(Preference preference) {

SharedPreferences sharedPrefs =
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
idioma = sharedPrefs.getString("preferencia_idioma", "NULL");

Locale locale = new Locale(idioma);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());

Log.d(logTag, "Se ha seleccionado: " + idioma);

return false;
}
};

/////////////////////////////////// Fin Código
Java /////////////////////////////////////////

Y en el Manifest.xml a todas las Activities le he añadido esto::
android:configChanges="locale"

Esto es para cuando el usuario seleccione uno de los idiomas en el
Dialog cambie el idioma, ya digo funciona entre comillas, porque
después de seleccionar el idioma hay que cambiar de Activities para
que los recursos (strings, drawables, etc.) cambien, sino no hay
manera.

Entonces necesitaría saber si hay algún método para actualizar todas
esas Activities cuando el usuario seleccione un idoma??

Saludos

Juan de Dios Maldonado Sánchez

unread,
Oct 27, 2011, 10:53:25 AM10/27/11
to desarrollad...@googlegroups.com
Eso que estás haciendo, debería estar prohibido. :)

2011/10/27 Javier Hernández <droi...@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.




--
An'Brain - Prueba el nuevo widget inteligente para tu Android.
Idiotizer Free - Idiotiza a tus amigos. (Se requieren auriculares)
Track My App - Realiza un seguimiento de tus aplicaciones en el Android market.

Jorge Gomes

unread,
Oct 27, 2011, 10:59:53 AM10/27/11
to desarrollad...@googlegroups.com
yo llamo a un metodo refresh(); justo despus de aplicar los cambios de idioma el qual finaliza la actividad i la lanza de nuevo

yo cambio el idioma des de la activity main.xml

private void refresh() {

change = true;

finish();

Intent myIntent = new Intent(this, MainMenu.class);

startActivity(myIntent);

Javier Hernández

unread,
Oct 27, 2011, 11:55:01 AM10/27/11
to desarrolladores-android
¿Por qué Juan de Dios?

On 27 oct, 15:59, Jorge Gomes <jordi.elca...@gmail.com> wrote:
> yo llamo a un metodo refresh(); justo despus de aplicar los cambios de
> idioma el qual finaliza la actividad i la lanza de nuevo
>
> yo cambio el idioma des de la activity main.xml
>
> private void refresh() {
>
>  change = true;
>
>  finish();
>
>  Intent myIntent = new Intent(this, MainMenu.class);
>
>  startActivity(myIntent);
>
> }
>
> El 27 de octubre de 2011 16:53, Juan de Dios Maldonado Sánchez <
> jua...@gmail.com> escribió:
>
>
>
>
>
>
>
> > Eso que estás haciendo, debería estar prohibido. :)
>
> > 2011/10/27 Javier Hernández <droin...@gmail.com>
> > An'Brain<https://market.android.com/details?id=com.nidrico.apps.anbrain.lite> -
> > Prueba el nuevo widget inteligente para tu Android.
> > Idiotizer Free<https://market.android.com/details?id=com.nidrico.apps.idiotizerfree>- Idiotiza a tus amigos. (Se requieren auriculares)
> > Track My App<https://market.android.com/details?id=com.nidrico.apps.trackmyapp>- Realiza un seguimiento de tus aplicaciones en el Android market.

Javier Hernández

unread,
Oct 27, 2011, 11:58:02 AM10/27/11
to desarrolladores-android
Gracias, pero sí finalizas la activity (en mi caso varias, 4 al menos
porque tengo un tabhost) no pararía los procesos en segundo plano como
el AsyncTask y el Service?

Saludos

On 27 oct, 15:59, Jorge Gomes <jordi.elca...@gmail.com> wrote:
> yo llamo a un metodo refresh(); justo despus de aplicar los cambios de
> idioma el qual finaliza la actividad i la lanza de nuevo
>
> yo cambio el idioma des de la activity main.xml
>
> private void refresh() {
>
>  change = true;
>
>  finish();
>
>  Intent myIntent = new Intent(this, MainMenu.class);
>
>  startActivity(myIntent);
>
> }
>
> El 27 de octubre de 2011 16:53, Juan de Dios Maldonado Sánchez <
> jua...@gmail.com> escribió:
>
>
>
>
>
>
>
> > Eso que estás haciendo, debería estar prohibido. :)
>
> > 2011/10/27 Javier Hernández <droin...@gmail.com>
> > An'Brain<https://market.android.com/details?id=com.nidrico.apps.anbrain.lite> -
> > Prueba el nuevo widget inteligente para tu Android.
> > Idiotizer Free<https://market.android.com/details?id=com.nidrico.apps.idiotizerfree>- Idiotiza a tus amigos. (Se requieren auriculares)
> > Track My App<https://market.android.com/details?id=com.nidrico.apps.trackmyapp>- Realiza un seguimiento de tus aplicaciones en el Android market.

Alberto Perez

unread,
Oct 28, 2011, 6:25:21 AM10/28/11
to desarrollad...@googlegroups.com
Estoy con Juan de Dios.

¿Para qué quieres hacer eso?

Me explico:
. Yo, en mis app,  uso por defecto el idioma inglés y luego el castellano. Uso la configuración del terminal. Nada más.

Yo creo que los usuarios tienen el terminal en su idioma, que es el que usan. Para qué van a estar cambiando el idioma en la aplicación?

Vamos, que el usuario pueda cambiar el idioma de la app dentro de la misma no lo veo. Por no hablar de que tienes que "calzarte/resetear/llámalo como quieras" todas las activities.

Saludos

2011/10/27 Javier Hernández <droi...@gmail.com>

Matias Berrueta

unread,
Oct 28, 2011, 7:57:12 AM10/28/11
to desarrollad...@googlegroups.com

Yo no lo veo mal, nos se si esta pensado el sdk de android para eso, pero suponete que en china tienen el celu en inglés pq en mandarín no hay mucho , y tu aplicación si tiene mandarín , estaría genial que pueda cambiarlo

Send from ATRIX™

Alberto Perez

unread,
Oct 28, 2011, 8:08:57 AM10/28/11
to desarrollad...@googlegroups.com
Ummm, desconocía esa situación. Yo pondría por defecto Mandarín y luego el resto de idiomas.
Cuando digo por defecto, me refiero a values\string si ningún tipo de sufijo.
De todas formas, un cambio "al vuelo" va a implicar volver a cargar las acvities.

Saludos y muchas gracias por la info :-)



2011/10/28 Matias Berrueta <matiasb...@gmail.com>

Jorge Gomes

unread,
Oct 28, 2011, 8:09:55 AM10/28/11
to desarrollad...@googlegroups.com
yo lo uso, porque aunque android soporte idiomas como catalán en la mayoría de teléfonos no esta, por eso lo uso, el async creo que si se para el service no.


Jorge Jesus Gomes Moreira
Tècnic de Recerca i Desenvolupament de Serveis
R & D Technical
T . +376 875085   M . +376 321167   


ANDORRA TELECOM - Plaça de la Germandat - AD600 Sant Julià de Lòria - Principat d'Andorra - www.andorratelecom.ad

AVIS
Aquest missatge i els documents adjunts només són per a la persona a qui van adreçats. Poden contenir informació confidencial, patentada o legalment protegida. No es renunciarà a la confidencialitat o al privilegi per qualsevol transmissió dolenta o errònia. Si vostè ha rebut aquest missatge per error, li agrairíem que l'esborrés immediatament del seu sistema, que en destruís totes les còpies del seu disc dur i que ho notifiqués al remitent. No ha d'utilitzar, revelar, distribuir, imprimir o copiar, directament o indirectament, cap de les parts d'aquest missatge si vostè no n'és el destinatari. Qualsevol opinió expressada en aquest missatge prové del remitent, llevat quan el missatge ho estableixi altrament i quan el remitent estigui autoritzat a manifestar que aquestes opinions provenen d'ANDORRA TELECOM. El correu electrònic via Internet no permet assegurar ni la confidencialitat dels missatges que es transmeten ni la seva recepció correcta. En el cas que el destinatari d'aquet missatge no consentís la utilització del seu correu electrònic via Internet, li agrairíem que ens ho notifiqués immediatament.

DISCLAIMER
This message and any of its attachments are intended exclusively for the named person. They may contain confidential, proprietary or legally privileged information. No confidentiality or privilege is waived or lost by any mistransmission. If you receive this message in error, please immediately delete it and all copies of it from your system, destroy any hard copies of it and notify the sender. You must not, directly or indirectly, use, disclose, distribute, print, sell, or copy any part of this message if you are not the intended recipient. Any views expressed in this message are those of the individual sender, except where the message states otherwise and the sender is authorised to state them to be the views of 'ANDORRA TELECOM'. Please note that Internet e-mail neither guarantees the confidentiality nor the proper receipt of the message sent. If the addressee of this message does not consent to the use of Internet e-mail, please communicate it to us immediately. 

Abans d'imprimir aquest correu electrònic penseu bé si és necessari fer-ho: el medi ambient és cosa de tots. 

Javier Hernández

unread,
Oct 28, 2011, 10:25:25 AM10/28/11
to desarrolladores-android
Gracias,

De momento utilizo un AsyncTask, aunque esto no es muy importante,
pero me interesa, de todas maneras tenía pensado cambiarlo por un
Service, ya comentaré si se para o no con el servicio.

¿Por qué quiero hacerlo?

Pues porque me lo piden así, si me piden que el teléfono haga el pino,
lo hago también :)

Saludos


On 28 oct, 13:09, Jorge Gomes <jordi.elca...@gmail.com> wrote:
> yo lo uso, porque aunque android soporte idiomas como catalán en la mayoría de teléfonos no esta, por eso lo uso, el async creo que si se para el service no.
>
> Jorge Jesus Gomes Moreira
> Tècnic de Recerca i Desenvolupament de Serveis
> R & D Technical
> T . +376 875085   M . +376 321167  
> jorge.go...@andorratelecom.ad  
>
> ANDORRA TELECOM - Plaça de la Germandat - AD600 Sant Julià de Lòria - Principat d'Andorra -www.andorratelecom.ad
>
> AVIS
> Aquest missatge i els documents adjunts només són per a la persona a qui van adreçats. Poden contenir informació confidencial, patentada o legalment protegida. No es renunciarà a la confidencialitat o al privilegi per qualsevol transmissió dolenta o errònia. Si vostè ha rebut aquest missatge per error, li agrairíem que l'esborrés immediatament del seu sistema, que en destruís totes les còpies del seu disc dur i que ho notifiqués al remitent. No ha d'utilitzar, revelar, distribuir, imprimir o copiar, directament o indirectament, cap de les parts d'aquest missatge si vostè no n'és el destinatari. Qualsevol opinió expressada en aquest missatge prové del remitent, llevat quan el missatge ho estableixi altrament i quan el remitent estigui autoritzat a manifestar que aquestes opinions provenen d'ANDORRA TELECOM. El correu electrònic via Internet no permet assegurar ni la confidencialitat dels missatges que es transmeten ni la seva recepció correcta. En el cas que el destinatari d'aquet missatge no consentís la utilització del seu correu electrònic via Internet, li agrairíem que ens ho notifiqués immediatament.
>
> DISCLAIMER
> This message and any of its attachments are intended exclusively for the named person. They may contain confidential, proprietary or legally privileged information. No confidentiality or privilege is waived or lost by any mistransmission. If you receive this message in error, please immediately delete it and all copies of it from your system, destroy any hard copies of it and notify the sender. You must not, directly or indirectly, use, disclose, distribute, print, sell, or copy any part of this message if you are not the intended recipient. Any views expressed in this message are those of the individual sender, except where the message states otherwise and the sender is authorised to state them to be the views of 'ANDORRA TELECOM'. Please note that Internet e-mail neither guarantees the confidentiality nor the proper receipt of the message sent. If the addressee of this message does not consent to the use of Internet e-mail, please communicate it to us immediately.
>
> Abans d'imprimir aquest correu electrònic penseu bé si és necessari fer-ho: el medi ambient és cosa de tots.
>
> El 28/10/2011, a las 13:57, Matias Berrueta <matiasberru...@gmail.com> escribió:
>
>
>
>
>
>
>
> > Yo no lo veo mal, nos se si esta pensado el sdk de android para eso, pero suponete que en china tienen el celu en inglés pq en mandarín no hay mucho , y tu aplicación si tiene mandarín , estaría genial que pueda cambiarlo
>
> > Send from ATRIX™
>
> > On Oct 28, 2011 7:25 AM, "Alberto Perez" <alberto.p...@gmail.com> wrote:
> > Estoy con Juan de Dios.
>
> > ¿Para qué quieres hacer eso?
>
> > Me explico:
> > . Yo, en mis app,  uso por defecto el idioma inglés y luego el castellano. Uso la configuración del terminal. Nada más.
>
> > Yo creo que los usuarios tienen el terminal en su idioma, que es el que usan. Para qué van a estar cambiando el idioma en la aplicación?
>
> > Vamos, que el usuario pueda cambiar el idioma de la app dentro de la misma no lo veo. Por no hablar de que tienes que "calzarte/resetear/llámalo como quieras" todas las activities.
>
> > Saludos
>
> > 2011/10/27 Javier Hernández <droin...@gmail.com>
> > Para tener acceso a más opciones, visita el grupo enhttp://groups.google.com/group/desarrolladores-android?hl=es.
>
> > --
> >http://www.apa42.com
> >http://es.linkedin.com/in/albertoperez42
>
> > --
> > Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
> > Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
> > Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
> > Para tener acceso a más opciones, visita el grupo enhttp://groups.google.com/group/desarrolladores-android?hl=es.

Javier Hernández

unread,
Oct 28, 2011, 3:39:07 PM10/28/11
to desarrolladores-android
Hola de nuevo,

una pregunta que es 'change' , algo que has añadido en el xml?

¿y cuál es la activity main.xml?, será un layout o el manifest no?

yo lo que añadí al manifest, a cada activity, fue esto
android:configChanges="locale"

Solo consigo que cierre la activity y la vuelva a iniciar pero no
cambiar el idioma.

¿me podrías decir?

Saludos

On 27 oct, 15:59, Jorge Gomes <jordi.elca...@gmail.com> wrote:
> yo llamo a un metodo refresh(); justo despus de aplicar los cambios de
> idioma el qual finaliza la actividad i la lanza de nuevo
>
> yo cambio el idioma des de la activity main.xml
>
> private void refresh() {
>
>  change = true;
>
>  finish();
>
>  Intent myIntent = new Intent(this, MainMenu.class);
>
>  startActivity(myIntent);
>
> }
>
> El 27 de octubre de 2011 16:53, Juan de Dios Maldonado Sánchez <
> jua...@gmail.com> escribió:
>
>
>
>
>
>
>
> > Eso que estás haciendo, debería estar prohibido. :)
>
> > 2011/10/27 Javier Hernández <droin...@gmail.com>
> > An'Brain<https://market.android.com/details?id=com.nidrico.apps.anbrain.lite> -
> > Prueba el nuevo widget inteligente para tu Android.
> > Idiotizer Free<https://market.android.com/details?id=com.nidrico.apps.idiotizerfree>- Idiotiza a tus amigos. (Se requieren auriculares)
> > Track My App<https://market.android.com/details?id=com.nidrico.apps.trackmyapp>- Realiza un seguimiento de tus aplicaciones en el Android market.

Javier Hernández

unread,
Oct 29, 2011, 6:17:18 AM10/29/11
to desarrolladores-android
Hola de nuevo,

He hecho pruebas en un teléfono y ahí si que funciona, lo que no me
permite seleccionar el idioma, porque al seleccionar la preferencia
aparece un dialog y automáticamente se cierra, pero elige el idioma
que estaba marcado por defecto, cierra la activity y la vuelve a abrir
en el idioma que había pillado,

este es el método:

////////////////////////////////////
private Preference.OnPreferenceClickListener prefClick = new
Preference.OnPreferenceClickListener() {

@Override
public boolean onPreferenceClick(Preference preference) {


SharedPreferences sharedPrefs =
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
idioma = sharedPrefs.getString("preferencia_idioma", "NULL");

Locale locale = new Locale(idioma);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());


return false;
}

};

//////////////////////////////


Quisiera hacer algo así

if (prefClick) {
refresh();
}

Pero con el prefClick me hace el refresh al tocar el menú de
configuración, necesitaría que fuera cuando se selecciona el item en
el dialog del menú del idioma.

¿cómo lo puedo hacer? no se que objetor comprobar.

Saludos

Alberto Perez

unread,
Oct 30, 2011, 5:40:15 PM10/30/11
to desarrollad...@googlegroups.com
Buenas, ya visto/comprendido los ejemplos que habéis comentado y os urge el tema, yo lo haría a la antigua usanza:

Crea hashtable o similar para tener los string de toda la App en memoria y según idioma, más un singleton. Al inicio de cada activity, cargar tú, a manita, los string dependiendo del idioma seleccionado en tu app. Eso sipe, deja un idioma por defecto (usando tal y como se suele hacer en android) por si falla tu selección de idioma.
De está forma pasar de reiniciar todas las activities y/o de parar los tasks/servicios que tengas.

Tampoco estaría mal que comprobases cuanto memoria de más va a necesitar la app. No sé de cuantos idiomas/strings estamos hablando.


Un saludo

P.D.: Muchas gracias por exponer ejemplos en los que no me había dado cuenta.


2011/10/28 Jorge Gomes <jordi....@gmail.com>

Javier Hernández

unread,
Oct 30, 2011, 11:59:31 PM10/30/11
to desarrolladores-android
Yo no sé si te a ti te ocurría pero cuando salgo de la aplicación, me
encuentro que hay otra instancia abierta debajo, una por cada vez que
se llamó al método refresh(), por lo menos a mí me ocurre así con un
MenúTabHost, lo solucioné así:

private void refresh() {
java.lang.System.exit(0);
finish();
Intent myIntent = new Intent(this, MenuTabHost.class);
startActivity(myIntent);
}


lo que no consigo es que no se llame a este método hasta después de
haber seleccionado un ítem en el diálogo, porque desde que selecciono
la preferencia se marca solo el ítem y se llama al método:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferencias);

listaPref = (ListPreference)findPreference("preferencia_idioma");
listaPref.setOnPreferenceClickListener(prefClick);

}

private Preference.OnPreferenceClickListener prefClick = new
Preference.OnPreferenceClickListener() {

@Override
public boolean onPreferenceClick(Preference preference) {


SharedPreferences sharedPrefs =
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
idioma = sharedPrefs.getString("preferencia_idioma", "NULL");

Locale locale = new Locale(idioma);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());

Log.d(logTag, idioma);

return false;
}

};

Pero está mal porque se selecciona el idioma cuando se abre el Dialog,
y debería de ocurrir justo después de seleccionarlo. Por eso es por lo
que decía que me llamaba al método refresh y cerraba la actividad sin
dejar opción a elegir un idioma. Solucionando eso ya creo que quedaría
todo.

¿Cómo lo podría hacer?


Saludos




On 27 oct, 14:59, Jorge Gomes <jordi.elca...@gmail.com> wrote:
> yo llamo a un metodo refresh(); justo despus de aplicar los cambios de
> idioma el qual finaliza la actividad i la lanza de nuevo
>
> yo cambio el idioma des de la activity main.xml
>
> private void refresh() {
>
>  change = true;
>
>  finish();
>
>  Intent myIntent = new Intent(this, MainMenu.class);
>
>  startActivity(myIntent);
>
> }
>
> El 27 de octubre de 2011 16:53, Juan de Dios Maldonado Sánchez <
> jua...@gmail.com> escribió:
>
>
>
>
>
>
>
> > Eso que estás haciendo, debería estar prohibido. :)
>
> > 2011/10/27 Javier Hernández <droin...@gmail.com>
> > An'Brain<https://market.android.com/details?id=com.nidrico.apps.anbrain.lite> -
> > Prueba el nuevo widget inteligente para tu Android.
> > Idiotizer Free<https://market.android.com/details?id=com.nidrico.apps.idiotizerfree>- Idiotiza a tus amigos. (Se requieren auriculares)
> > Track My App<https://market.android.com/details?id=com.nidrico.apps.trackmyapp>- Realiza un seguimiento de tus aplicaciones en el Android market.

Felipe Calderon Barragan

unread,
Sep 19, 2012, 2:08:14 PM9/19/12
to desarrollad...@googlegroups.com
Tienes que poner los string como un recurso de xml y luego crear los de los respectivos xml.

http://androideity.com/2011/08/17/manejo-de-varios-idiomas-en-una-aplicacion-android/

--
Felipe Calderon Barragan
Linux User # 470534

suso22

unread,
Sep 19, 2012, 3:13:34 PM9/19/12
to desarrollad...@googlegroups.com
    no comprendo muy bien tu respuesta, aver creo que eso ya lo tengo hecho, es decir yo tengo mi, values-en, que me funciona
perfetamente y me traduce todos los strings, al ingles, pero las etiquetas de las pestañas no,y no se como hacer para que en la parte de java lo traduzca.
Reply all
Reply to author
Forward
0 new messages