4

バイリンガル(英語/スペイン語)である必要があるAndroidアプリに取り組んでいます。ユーザーが設定から目的の言語を選択し、選択した言語に基づいてアプリのメインアクティビティ(TabActivityのサブクラス)で次のロケール変更を実行できるようにします。

private void setApplicationLanguage(String languageCode)
{
    // Set the locale to the specified language code.
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    android.content.res.Configuration conf = res.getConfiguration();
    conf.locale = new Locale(languageCode.toLowerCase());
    res.updateConfiguration(conf, dm);
}

メインアクティビティは4つのタブをホストし、それぞれに独自のアクティビティ(場合によってはActivityGroup)があります。私がしたいのは、言語が変更されたときに、開いているすべてのアクティビティが再開されるだけで、文字列が適切な言語で再ロードされることです。また、受け入れ可能な(ただしあまり望ましくない)のは、開いているすべてのアクティビティを完全に破棄し、ユーザーがアプリを手動で再起動する必要があるため、すべての文字列が適切な言語で再読み込みされることです。

finish()そのアクティビティを終了させるメインアクティビティから呼び出してみました。ただし、アプリを再起動すると、メインアクティビティによって「ホスト」されている子アクティビティ(タブごとに1つ)は引き続き前の言語で表示されます。これは、子供の活動が私にとって再帰的に「終了」しなかったためだと思います。

また、メインアクティビティと他のアクティビティでAndroidManifest.xmlから「locale」属性を含める/除外しようとしましたが、ローカルを変更してもアクティビティが再開することはありません。それでは、「再起動」はどのように現れますか?それはそれを呼ぶのでしょうか、onCreate()それとも単にonResume()、あるいは何か他のものでしょうか?このアプローチが自動的にアクティビティを再開しonCreate()、ロケールが変更されたときに呼び出す場合、これを実現する方法に関する具体的なガイダンスが私の場合の最良のルートであるように思われます。

ソリューションはAndroidAPIレベル7で実行する必要があるためIntent、フラグを使用して新しいものを作成することFLAG_ACTIVITY_CLEAR_TASKは明らかに利用できないオプションです。

4

2 に答える 2

1

タブのコンテンツに使用されるBroadcastReceiverそれぞれの内部クラスとしてを使用できます。Activity

で受信者を登録onResumeし、 で登録解除しonPauseます。

ロケールが変更されたときにメインActivityに「スティッキー」ブロードキャストを送信させ、 in の結果を使用registerReceiveronResumeて を取得してIntent、ロケールが変更されたかどうかを確認します。Activityこれは、データを動的に更新できるようにするために、「可視」でも機能するはずです。

于 2012-05-23T21:55:41.203 に答える
0

LocalBroadcastManager関係者にロケールの変更を知らせるために を実装しました。問題は、タブのラベルなど、必要なすべてを更新できなかったことです。最も効果的であることが判明したのは、「メイン」(タブ) アクティビティの次のとおりです。

    Intent intent = new Intent(mainActivity.getApplicationContext(), MainTabActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    mainActivity.startActivity(intent);
于 2012-05-30T20:20:58.600 に答える