19

アプリのロケールをユーザーが指定したロケールに強制しようとしています。これはデモンストレーションに使用される可能性があるため、デバイス全体ではなく、アプリの言語/ロケールを変更したいと思います。

私はSOを見回して、ここで見つけたすべてのヒントを使おうとしました。結果:新しい言語でテストアクティビティを再開できますが、向きを変更すると、ロケールは常にデバイスのものにリセットされます。

私の問題を再現できるように、ミニマルなプロジェクトをアップロードしました。UIの縮小は無視してください。重要ではありません:)

4

5 に答える 5

10

このコード スニペットは必要なことを行います。テスト済みです。たとえば、ユーザーがメイン アクティビティのメニューから言語を切り替えられるようにしたいとします。言語フラグをユーザー設定として保存し、次のように「onCreate()」および「onConfigurationChanged()」で確認することでこれを行うことができます。

    public class MainActivity extends Activity {

SharedPreferences mPrefs1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this);
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage());
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());

    setContentView(R.layout.activity_main);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this);
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage());
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());
    setContentView(R.layout.activity_main);
}

// Declaring the Menu options
@Override
public boolean onCreateOptionsMenu(Menu menu)
{       
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
}

//handle menu item selection
public boolean onOptionsItemSelected(MenuItem item)
{
  switch (item.getItemId()) {
    case R.id.menu_switch_language:
        String languageToLoad  = getResources().getString(R.string.switch_language);

        mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = mPrefs1.edit();
        editor.putString("languagePref", languageToLoad);
        editor.commit(); // Very important to save the preference                      
        finish();
        startActivity(getIntent());
        return true;
    default:
        return super.onOptionsItemSelected(item);
  }
}   

}

于 2013-01-30T17:38:53.853 に答える
3

私はちょうどあなたのコードを見ました。

Locale使用している が Android からではなく、java.util からのものであることを確認してください。あなたのコードは、携帯電話のロケールを変更しません。

テストするには:

  • 携帯電話をスペイン語に設定しました。
  • アプリを開く
  • ボタンをクリックします
  • 家に帰る
  • アイコンは英語ではなくスペイン語でした。

Locale をデフォルトに設定し、画面の回転後に同じ値を表示できるようにするだけの場合:

それ以外の:

android:configChanges="locale"

使用する:

android:configChanges="locale|orientation"
于 2010-02-24T11:45:09.333 に答える
3

私にとってうまくいったのは、レイアウトを膨らませる直前にロケールを設定することです:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String userLocale = "Wolof"; // adapt to your need
    Locale locale = new Locale(userLocale);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

    setContentView(R.layout.my_activity);

    ...

}
于 2015-07-14T18:21:16.433 に答える
2

方向の変更時にアクティビティが再起動されているため、ロケールのリセットが発生していますか?

その場合、方向の変更を傍受または防止できます:回転 Android でのアクティビティの再起動

于 2010-02-24T07:58:26.910 に答える
1

Application::onCreateおよびApplication::onConfigurationChangedでロケールを強制する必要があります。アプリケーション クラスをAndroidManifest.xmlに登録することを忘れないでください。

于 2015-01-15T09:19:02.413 に答える