2

Android の実行時に言語を変更する必要があります (はい、これは適切な動作ではないことはわかっていますが、これは要件です...)。

したがって、すべてのアクティビティが拡張される基本クラスがあります。このクラスには次の機能があります。

public static void changeLanguage(Context context) {
    Resources res = context.getResources();
    /*
     * Change locale settings in the app.
     */
    DisplayMetrics dm = res.getDisplayMetrics();

    /*
     * Store and load data in this preferences
     */
    android.content.res.Configuration conf = res.getConfiguration();
    String[] localArray = res.getStringArray(R.array.language_short_array);
    if (localArray != null) {
        SharedPreferences settings = context.getSharedPreferences(
                MyService.APP_ID, MODE_PRIVATE);
        conf.locale = new Locale(localArray[settings.getInt(
                PREFERED_LANGUAGE_KEY, 0)]);
        res.updateConfiguration(conf, dm);
    }
}

onCreate でこのメソッドを呼び出します。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    changeLanguage(this);
}

これはスーパークラスです。私のアクティビティはそれから拡張され、最初に super.onCreate を呼び出します。この呼び出しの後、レイアウトを設定し、設定を初期化します...

私のコード行でうまくいくと思いました。しかし、次の問題があります。活動によって言語が変わる場合と変わらない場合があります。

それにデバッグブレークポイントを設定し、プログラムが一時停止した後に続行を押すと、すべて正常に動作します。したがって、場合によっては、アプリケーションが「十分に遅い」場合、言語は正しく変更されますが、アプリケーションが速すぎると言語は変更されません...

私の問題の解決策はありますか?私の言語がいつでも正しく変更されることをどのように確認できますか?

どうもありがとう!

編集:これは私のスーパークラスから拡張されたクラスの例です

public class MainMenuActivity extends BaseActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start);
    }
}
4

2 に答える 2

3

changeLanguage(this);言語が変更されたとき、またはアプリが読み込まれたときにのみ呼び出す必要があります。res.updateConfiguration(conf, dm);グローバル構成を更新し、アクティビティ インスタンスではなくアプリ インスタンスに固有です。

を変更すると、言語の変更を確認するためにそれを再作成する必要がありますlocale。これは、方向の変更を強制してから、次のように強制的に戻すことで簡単に実行できます。ActivityActivity

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

onCreate言語の変更後に反撃すると、が呼び出されないため、古い言語が表示されます。言語が変更されたことを検出しonResume、 の再作成を強制する必要がありActivityます。

-= 編集 =-

画面の向きを使用して をリロードするActivityと、一部のデバイスで少しバグがあることが判明しました。現在、これを使用して現在のをリロードしていActivityます:

public static void resetScreen(Activity activity) {
    if (activity != null) {
        if (Build.VERSION.SDK_INT >= 11) {
            activity.recreate();
        } else {
            Intent intent = activity.getIntent();
            activity.overridePendingTransition(0, 0);
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            activity.finish();

            activity.overridePendingTransition(0, 0);
            activity.startActivity(intent);
        }
    }
}
于 2013-04-19T22:01:09.430 に答える
0

スーパークラスを拡張するアクティビティの例を投稿する必要があると思います。ただし、 onCreate() で changeLanguage を呼び出すことは、私には疑わしいようです。これは、アプリが最初に初期化されたときにのみ実行されます。アプリの読み込み後に言語を変更するには、アプリを停止して再作成する必要があります。

于 2013-04-18T17:51:29.620 に答える