0

アプリケーションでロケールをその場で変更するプロジェクトに取り組んでいます。メイン UI は res/layout/main.xml で作成されました。これが私のコードです:

OnCreate() 
{
           ... ...
    Configuration config = getBaseContext().getResources().getConfiguration();
    config.locale = Locale.FRANCE;  // set locale to french
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
    setContentView(R.layout.main);
}

結果: main.xml の android:text="@string/myString" は、私が期待した res/values-fr/strings.xml で myString を使用しています。

ロケールがイタリア語に変更される別の関数:

{   ... ...
    Configuration config = getBaseContext().getResources().getConfiguration();
    config.locale = Locale.ITALY;   // change locale to Italian
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}

その関数が呼び出された後、 getString(R.string.myString) は res/values-it/strings.xml で myString を使用しています。これは私が期待したものです。ただし、メインの UI は変更されません。main.xml の android:text="@string/myString" は、アクティビティを強制的に再起動するまで、res/values-fr/strings.xml の myString を引き続き使用しています。

{
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}

view.invalidate() と layoutInflater.inflate(R.layout.main, this) を呼び出そうとしましたが、どれも機能しません。どんなアイデア/提案も大歓迎です。

4

3 に答える 3

1

非常に簡単です。更新の準備ができたら、onCreate メソッドがそれらを適切に処理できることを確認してから、アクティビティでrecreate()を呼び出します。Android はレクリエーションを気にかけ、通常どおりフローを呼び出します。

于 2012-10-01T21:14:18.453 に答える
0

ロケールはデバイス設定から自動的に駆動できるため、手動で変更する理由が本当に気になりますが、意図的に行ったふりをしましょう :)

あなたがする必要があるのは - を呼び出すだけsetContentView(R.layout.main);です。アクティビティは、ロケール設定に基づいて UI を自動的に更新します。

ここで注意が必要な点は、動的データ (ボタン、テキスト ビューなどへの参照など) がある場合、古いものは関連性がなくなるため、参照も更新する必要がある場合があることです。

于 2012-10-01T20:43:38.003 に答える
0

ロケールを変更するために使用されるコードは、カスタム Application クラスに移動することをお勧めします。onCreate/onConfiguration の変更で Application を拡張する MyApplication のようなものを作成すると、次のようなコードになります。

String lang = getSharedPreferences(PREFS_APP, 0).getString(LANGUAGE, Locale.getDefault().getLanguage());
locale = new Locale(lang);
if (locale != null) {
 newConfig.locale = locale;
 Locale.setDefault(locale);
 getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
}

このカスタム クラスを AndroidManifest セクション Application ( android:name=".MyApplication") に登録します。
これは、Android がシステムで設定されている別のロケールを設定することを好まないという考え方です。
設定アクティビティで、ロケールの変更後にこれを行います。

Configuration c = new Configuration();
Locale newLocale = new Locale(localeCode);
Locale.setDefault(newLocale);
c.locale = newLocale;
ctx.getResources().updateConfiguration(c, ctx.getResources().getDisplayMetrics());

そして、次のように再起動して MainActivity に戻ります。

Intent goTo = new Intent(ctx, MainActivity.class);
goTo.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
act.startActivity(goTo);

重要なことを見落としていないことを願っていますが、これが言語を動的に変更することの背後にある主なアイデアです。

于 2012-10-01T20:52:13.200 に答える