4

アプリのローカリゼーションに関して小さな問題が発生しました:

これがケースです - システム言語に関係なく、常にノルウェー語でアプリケーションを使用するオプションをユーザーに与えました.

ほとんどの場合は問題なく動作します (設定に移動し、ノルウェー語を強制するボックスにチェックを入れ、「戻る」を押すと、前のアクティビティがノルウェー語で表示されます - 同じことが「逆」です)、ただし、言語の変更のみです。 「バックスタック」の最初のアクティビティを正しく更新 (リソースをリロード) しているようです。

典型的なシナリオを説明するには:

ユーザーがアプリを起動すると、メインのアクティビティ (英語) が表示されます。そこから、彼は 2 番目のアクティビティを選択します (これも英語です)。次に、(2 番目のアクティビティのメニューから) 設定に移動し、ノルウェー語を強制するように設定します。

その後、元に戻ると、2 番目のアクティビティが正しく更新され、ノルウェー語で表示されます (今のところ問題ありません)。しかし、メインのアクティビティに戻るためにもう一度「戻る」を押すと、まだ英語で表示されます...

彼が戻ってアプリを再度起動すると、メインのアクティビティがノルウェー語で正しく表示されます...

私が何をすべきかについて提案してくれる明るい人はいますか?

関連するソース コード:

表示言語を設定するためにすべてのアクティビティに含まれるコード:

onCreate では:Globals.locale_default = Locale.getDefault().getDisplayLanguage();

public void onStart() {
    super.onStart();
    forceNorwegian = settings.getBoolean(getString(R.string.pref_key_forceNorwegian).toString(), false);
       if (forceNorwegian) {
           languageCheck("no");
       } else {
            Globals.locale = null;
            languageCheck(Globals.locale_default);
       }
}

public void languageCheck(String lang) {
    Globals.locale = new Locale( lang );
    // Check the current system locale and change it to Norwegian if it's not already the default
    Globals.checkLocale( this );
    if (Globals.language_changed) {
        // Restart activity
        Intent restart = getIntent();
        finish();
        Globals.language_changed = false;
        startActivity(restart);
    }
}

Globals.java:

public class Globals {

public static Locale locale = null;
    public static String locale_default = null;
    public static boolean language_changed = false;

    public static void checkLocale( Activity a ) {
        if( locale == null )
            return;

        Configuration config = a.getBaseContext().getResources().getConfiguration();
        if( !config.locale.equals( locale ) )
        {  // Change to the new locale.  Everything will need to be closed or reloaded.
            config.locale = locale;
            a.getBaseContext().getResources().updateConfiguration( config, null );
            language_changed = true;
        }
    }
}
4

2 に答える 2

1

この問題は、ブール値の Globals.language_changed が静的であるという事実に起因している可能性があります。したがって、一番上のアクティビティから languageCheck が呼び出されると、このブール値は、languageCheck が後ろのアクティビティから呼び出される前に false になります。階層の前のアクティビティが開いているかどうかを確認するためにいくつかのチェックを入れることができます。開いている場合は、ユーザーが [戻る] ボタンを押した場合に備えて、ブール値を true に設定したままにします。別のオプションは、新しいロケールが選択されたときに、開いているすべてのアクティビティを一度にリロードするロジックです。

--編集-- さらに調べてみると、各アクティビティの onStart のブール値も更新しているため、これはあなたの問題ではないと思います (初めて読んだときにこの部分を見逃していました)。スタックの上位のアクティビティの 1 つが変更されたときにロケールが変更された可能性がありますが、スタックの下位のアクティビティは更新する必要があるだけです。下のアクティビティのいずれかで向きが変わると、英語からノルウェー語に変わりますか?

--編集 2 -- それが問題かどうかを確認する最も簡単な方法は、Globals.checkLocale にいくつかのログを追加して、この条件ステートメントが true かどうかを確認することです。

if( !config.locale.equals( locale ) )

それが問題であることが判明した場合、考えられる解決策の 1 つは、各アクティビティにグローバル インスタンスではなくローカル Locale インスタンスを保存し、それと比較することです。たとえば、各アクティビティの onCreate メソッドで Locale インスタンスを取得できます。

myLocale = getBaseContext().getResources().getConfiguration().locale;

次に、Globals.checkLocal を呼び出す代わりに、次の条件ステートメントを (各アクティビティの languageCheck メソッドで) 実行します。

if( Globals.locale != null && !Globals.locale.equals( myLocale ) )
{
    Configuration config = getBaseContext().getResources().getConfiguration();
    config.locale = Globals.locale;
    getBaseContext().getResources().updateConfiguration( config, null );
    Intent restart = getIntent();
    finish();
    startActivity( restart );
}

再起動すると、Activity の onCreate メソッドが再度呼び出され、myLocale が正しい値に更新されます。これは単なる簡単な解決策であり、必ずしも最善の解決策ではありません..たとえば、必要に応じて、これを拡張してそのコードの一部をグローバルのメソッドに移動したり、onCreate とは異なる場所を使用してローカル Locale インスタンスを取得したりできます。各アクティビティ。

于 2012-07-29T14:28:07.790 に答える
0

そのラインだと思います

  Configuration config = a.getBaseContext().getResources().getConfiguration();

getBaseContext()別のアクティビティ内からアクティビティへの参照のみを取得します。したがって、メイン アプリケーションではなく、前のアクティビティに戻ったときに変更が反映されるのはそのためです。

アプリケーション全体の変更を反映getApplicationConext()する代わりに使用します。これにより、アプリケーションのライフサイクル全体に変更が結び付けられるため、アプリ内のすべてのアクティビティが

于 2012-07-29T01:48:37.980 に答える