Quero que meu aplicativo ofereça suporte a três idiomas: espanhol, português e inglês. E dê a opção de selecionar o idioma no aplicativo. Eu fiz
1) 3 pastas drawable drawable-es, drawable-pt, drawable.
2) pasta de 3 valores valores-es, valores-pt, valores. Altere os valores String.xml de acordo com os idiomas.
Tenho imageView para selecionar o idioma.Ao clicar nele, abra o menu que consiste na opção Inglês, Espanhol, Português.
Eu defino Locale dentro do aplicativo na seleção de opções por este código
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.en:
Locale locale = new Locale("en");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show();
break;
case R.id.pt:
Locale locale2 = new Locale("pt");
Locale.setDefault(locale2);
Configuration config2 = new Configuration();
config2.locale = locale2;
getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show();
break;
case R.id.es:
Locale locale3 = new Locale("es");
Locale.setDefault(locale3);
Configuration config3 = new Configuration();
config3.locale = locale3;
getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show();
break;
}
return super.onOptionsItemSelected(item);
}
Eu declarei no Manifest- android: configChanges = "locale"
Funciona, mas tem algum problema.
Problema:-
1) Quando o idioma é selecionado, a tela que consiste na imagem da seleção do idioma não muda, mas as outras telas são alteradas.
2) Após a mudança de orientação, restaurar o idioma do aplicativo de acordo com a localidade do telefone.
fonte
android:configChanges="locale"
for your Activity dentro do AndroidManifest.xmlRespostas:
É um trecho da página da web: http://android.programmerguru.com/android-localization-at-runtime/
É simples alterar o idioma do seu aplicativo após o usuário selecioná-lo na lista de idiomas. Tenha um método como o abaixo, que aceita o local como String (como 'en' para inglês, 'hi' para hindi), configure o local para seu aplicativo e atualize sua atividade atual para refletir a mudança no idioma. A localidade que você aplicou não será alterada até que você a altere manualmente novamente.
Certifique-se de importar os seguintes pacotes:
adicione o manifesto à atividade android: configChanges = "locale |idance"
fonte
finish()
precisa ser chamado antesstartActivity(refresh)
. Caso contrário, o aplicativo pode sair em vez de a atividade ser reiniciada.Boas soluções explicadas muito bem aqui. Mas aqui está mais um.
Crie sua própria
CustomContextWrapper
extensão de classeContextWrapper
e use-a para alterar a configuração Locale para o aplicativo completo. Aqui está um GIST com o uso.E então ligue para o
CustomContextWrapper
com identificador de localidade salvo, por exemplo,'hi'
para o idioma Hindi no método de ciclo de vida da atividadeattachBaseContext
. Use aqui:fonte
MyContextWrapper.warp
inonAttach
de apenas um fragmento do meu aplicativo, mas o idioma foi alterado para todo o aplicativo, mas os títulos das atividades não foram alterados, acho que é porque os títulos do manifesto têm precedência, mas se eu chamar o mesmo método emonAttachBaseContex
minha subclasse de aplicação, os títulos das atividades também mudam para o idioma selecionado, mas então as mudanças são aplicadas apenas ao fragmento que chamei no método warp, por que isso ?warp
método noonAttach
do fragmento, anteriormente eu disse que só precisava fazer isso com o fragmento de atividade principal e a linguagem alterada em Todo o aplicativo é verdade, mas para todas as outras alterações de linguagem de fragmentos para inglês na mudança de configuração, então eu preciso colocaronattach
todos os fragmentos e em vez de manifestar eu defini os títulos da barra de ação no código, agora o aplicativo está funcionando como esperado. obrigadoattachBaseContext
função. E isso serve para todas as telas. Você criou uma `BaseActivity 'para todas as atividades em seu aplicativo?wrap()
código precisa ser executado a cada alteração de configuração, então coloquei no Atividade abstrata da qual todas as outras atividades se estendem, agora está funcionandoVocê deve remover
android:configChanges="locale"
do manifesto, o que fará com que a atividade seja recarregada, ou substituir oonConfigurationChanged
método:fonte
todo o código de @ Uday acima é perfeito, mas apenas uma coisa está faltando (configuração padrão em build.gradle)
}
O meu não estava funcionando apenas porque os idiomas não foram mencionados no arquivo de configuração (build.gradle)
depois disso, todos os idiomas começaram a funcionar
fonte
Aqueles que estão obtendo o problema de versão tentam este código.
fonte
O código de amostra do Udhay funciona bem. Exceto a pergunta de Sofiane Hassaini e Chirag SolankI, para a reentrada não dá certo. Tento chamar o código de Udhay sem reiniciar a atividade em onCreate (), antes de super.onCreate (savedInstanceState) ;. Então está tudo bem! Apenas um pequeno problema, as strings do menu ainda não mudaram para o Locale definido.
fonte
Intent refresh = new Intent(this, ThisActivity.class); startActivity(refresh);
?