1

私はAndroid開発にまったく慣れていないので、ローカリゼーションに少し問題があります。デバイスの現在の言語以外の既定の言語を使用することをユーザーが選択できるアプリがあります。たとえば、ドイツに住んでいるフランス人ユーザーで、自分の電話を「ドイツ語」に設定している場合、(さまざまな理由で) 私のアプリをフランス語で使用したいが、自分の電話のデフォルト言語をフランス語に設定したくない場合があります。

私のアプリには、いくつかのビューをロードおよびアンロードするアクティビティが 1 つしかありません。非常にシンプルなアプリですが、大きなコンテンツ (テキストと画像) があります。

これを実現するために、以下のコードを使用します。

うまく機能しますが、いくつかの問題があります。

  • ユーザーが適切なボタンを使用して新しい言語を選択し、アプリを再起動した場合 (または、アプリを強制的に終了させた場合...): 最初のビューのみが新しい言語を使用します。次のビューは以前の言語に設定されたままです。

  • ユーザーが自分のデバイスをオフにすることを選択した場合、同じ問題: アクティビティの最初のビューのみが選択した言語に設定されます (変数は設定から​​読み取られます)。

  • ただし、ユーザーがアプリをもう一度再起動することを選択した場合、すべてのビューとサブビューは新しい言語に正しく設定されます。

  • また、ユーザーが以前にアプリを少なくとも 1 回再起動した場合、各言語の変更は正常に完了します。アプリをもう一度再起動する必要はありません。

それで、新しい言語を正しく設定する方法はありますか

  • アプリの最初の再起動直後

  • ユーザーが以前に自分のデバイスの電源を入れ直したことがある場合

どんな助けでも大歓迎です。これが私が使用するコードです(簡略化):

public void onCreate(Bundle savedInstanceState) {
    SharedPreferences myPrefs;
    myPrefs = getSharedPreferences("langage", MODE_PRIVATE);  
    String langageToLoad = myPrefs.getString("langageToLoad", "");
    changeLangage(langageToLoad);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
     (...some other code...)
    }

public void setLangageEn(View view){
    changeLangage( "en");
    setPreference( "en"); 
    // finish(); // optionnal
    }

public void changeLangage(String langage) {
    Locale locale = new Locale(langage); 
    Locale systemLocale = Locale.getDefault();
    if (systemLocale != null && systemLocale.equals(locale)) {
    return;
    }
    Locale.setDefault(locale);
    android.content.res.Configuration config = new android.content.res.Configuration();
    config.locale = locale;
    getResources().updateConfiguration(config, getResources().getDisplayMetrics());
    }

public void setPreference( String langage){
    SharedPreferences languagepref = getSharedPreferences("langage",MODE_PRIVATE);
    SharedPreferences.Editor editor = languagepref.edit();
    editor.putString("langageToLoad",langage );
    editor.commit();
    }
4

1 に答える 1

0

次のこと:1つのアクティビティをfinish()したからといって、前のアクティビティを閉じる必要がないため、 onResume() を呼び出して onCreate() を「ジャンプ」するだけで、まだメモリ不足ではなく、ドン言語チェックを実装する onCreate() (onResume() の前にある) を呼び出さないでください。


この問題を回避する方法の 1 つは、カスタムの「アプリケーション クラス」(アプリケーションを拡張する) を作成し、そこで localize-preference を確認して、getter および setter メソッドでフィールドに設定することです。次に、アプリケーション インスタンスを取得するには (アプリケーションの開始時に作成されます!(2 番目のアクティビティを開始するときではありません..)、アクティビティで ((CustomApp)Context.getApplicationContext).getCustomLocalization() を実行できます。

でも。すべてのアクティビティで新しい言語設定を実際に読み込むには、必ず onResume() で確認し、言語を 1. CustomApp のフィールドに設定し、2. 設定を変更するときに (おそらく同じセッター メソッドを使用して) 設定してください。 . 次に、設定アクティビティを終了して再作成し、新しい設定をロードします。

于 2013-03-07T08:40:06.633 に答える