2012-09-01 7 views
16

私は、スピナーを使用してアプリケーションの言語を変更できるようにしたいと思います。 私はいろいろ考えましたが、彼らはこのアクティビティの言語をすべてのアクティビティではなく変更していますので、保存したいので、ユーザがアプリケーションを再起動すると、最後に選んだ言語が見つかります。Androidランタイムでアプリケーション言語を変更する方法

答えて

31

onCreate()のすべてのアクティビティで同じコードがSharedPreferencesからlanguageToLoadをロードする

+0

これはアンドロイドシステム全体で変わるのだろうか、それともアプリケーションのためだけに変わるだろうか?ユーザーがアプリケーションを終了すると、アンドロイドのデフォルトlang –

+0

@ KarueBensonKarueを実行することができるように、アプリケーションでのみ変更されます。 –

+0

ご回答ありがとうございます –

5

SharedPreferencesを使用して、ユーザーが選択した言語を追跡し、onCreate()およびonResume()メソッドでその言語を使用するようにアクティビティを設定します。それはアプリの再起動などを渡って持続します。この方法で

あなたは、あなたがこの

SharedPreferences languagepref = getSharedPreferences("language",MODE_PRIVATE); 
SharedPreferences.Editor editor = languagepref.edit(); 
editor.putString("languageToLoad",languageToLoad); 
editor.commit(); 

と使用のような言語を保存する必要がありますが

String languageToLoad = "en"; // your language 
Locale locale = new Locale(languageToLoad); 
Locale.setDefault(locale); 
Configuration config = new Configuration(); 
config.locale = locale; 
getBaseContext().getResources().updateConfiguration(config, 
getBaseContext().getResources().getDisplayMetrics()); 

をしたいスピナーでこのコードまたは任意の方法を使用することができます

+1

すべてのデベロッパーはアプリでこの方法を使用していますか? –

+1

私は自分のコーデックにアクセスできないので、他の開発者に話すことはできません。 –

+1

これは、1つのアクティビティにある情報を他のアクティビティに渡すために推奨され、よりきれいな方法です。それを行うためのもう一つの、よりハッキリな/不正な方法は、データをアクティビティの静的なフィールドとして保持し、他のアクティビティからアクセスすることですが、誰かが尋ねるならば、 :) –

2

これは古い質問ですが、とにかくそれに答えるでしょう: ) アプリケーションクラスを拡張して、すべてのアクティビティでAbol3zのソリューションを適用できます。クラスを作成します。

public class MyApplication extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
     String lang = preferences.getString("lang", "en"); 
     Locale locale = new Locale(lang); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     getBaseContext().getResources().updateConfiguration(config, 
       getBaseContext().getResources().getDisplayMetrics());  
    } 
} 

とマニフェストにアプリケーションクラスとしてMyApplicationを設定:

<application 
     android:name=".MyApplication" 
     ... 
/> 

あなたは(あなたのスピナーで)LANG値を設定することができます。

我々が使用
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext()); 
preferences.edit().putString("lang", "en").commit(); 
+1

[documentation](https://developer.android.com/reference/android/app/Application.html#onCreate())によると、アプリケーションonCreate()はアプリの起動時にのみ呼び出されます。だから、あなたは本当にランタイムで言語を変更していないが、次のアプリの開始時に、右ですか?編集:元の質問を再読んで、あなたの方法はすべての後に問題を解決しました。 – Micha

1
btnChange.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext); 
      //preferences.edit().putString("lang", "bn").commit(); 

      String lang = preferences.getString("lang", "en"); 
      //Log.e("lang", "lang in Main Activity:"+lang); 
      if (lang.equalsIgnoreCase("en")){ 
       setLocale("bn"); 
       preferences.edit().putString("lang", "bn").commit(); 
       btnChange.setText("Eng"); 
      }else if(lang.equalsIgnoreCase("bn")){ 
       setLocale("en"); 
       preferences.edit().putString("lang", "en").commit(); 
       btnChange.setText("বাংলা"); 
      } 
     } 
    }); 


public void setLocale(String lang) { 

    myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    Intent refresh = new Intent(this, MainActivity.class); 
    startActivity(refresh); 
    finish(); 
} 

テスト目的のための2つの言語。すべての文字列を異なる名前の値と値-bnという異なるフォルダに保存します。

関連する問題