13

リモートPCプログラムのクライアントとして機能するAndroidアプリがあります。PCが実行時にロケールを変更するようにAndroidアプリに指示できるように、つまりアプリを起動できるように機能を追加したいと思います。PCと通信します。しばらくして、PCはアプリにスペイン語または中国語などに切り替えるように指示します。

すでにすべてのレイアウトと文字列リソースがそれぞれのロケールに設定されています。私たちのアプリはユーザーに表示される唯一のアプリであるため、デバイスの残りの部分が英語のままであるかどうかは関係ありません。

これについては、Androidのプログラムによる言語の変更に別のスレッドがありますが、結論に達していないようです。

置くことができます。。。

Locale locale = new Locale(sTheNewLocale);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
      getBaseContext().getResources().getDisplayMetrics());

。。。setContentView( )の前のonCreate ()にありますが、画面が起動して実行された後にロケールを変更したい場合は、実際には役に立ちません。アクティビティがすでに実行された後にコンテンツビューを再ロードする方法はありますか?それで、ロケールをオンザフライで確実に変更する実用的な方法ありますか、それともアプリを起動する前にデバイス全体を新しいロケールに設定する以外はできないことを上司に伝える必要がありますか?

4

4 に答える 4

3

アクティビティの新しいインスタンスを開始して、古いインスタンスを終了できます。これは、任意の言語を保存してアプリを再起動する方法の完全な(テストされていない)例です。restartInLanguage好みの言語で電話するだけです。

public class YourMainActivity extends Activity {
    private static final String APP_SHARED_PREFS = "com.example.test";
    private SharedPreferences settings;
    private Editor editor;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        settings=getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE);
        editor=settings.edit();

        Locale locale = new Locale(settings.getString("lang", "default-lang"));
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getResources().updateConfiguration(config, getResources().getDisplayMetrics());

        // your stuff...
    }

    public void restartInLanguage(String lang) {
        editor.putString("lang", lang);
        editor.commit();
        Intent intent = getIntent();
        finish();
        startActivity(intent);
    }

    // ...
}
于 2012-11-01T16:58:39.063 に答える
1

@weston と @rekire (両方とも +1) を組み合わせて、このユースケースを処理するように拡張しました。

  • ActivityA => ActivityB => SettingsActivity-changeLocale

親アクティビティの後changeLocale、新しいロケールを反映するために再作成する必要があります。SettingsActivityActivityAActivityB

私の解決策: ActivityA と ActivityBは、ロケールが変更された場合LocalizedActivityにチェックインするものを継承し、必要に応じてトリガーしますonResumerecreate()

したがって、 を継承するすべてのアクティビティは、 LocalizedActivityアプリ固有のロケールの変更を自動的に処理します。

/**
 * An activity that can change the locale (language) of its content.
 *
 * Inspired by http://stackoverflow.com/questions/13181847/change-the-locale-at-runtime
 *
 * Created by k3b on 07.01.2016.
 */
public class LocalizedActivity extends Activity {
    /** if myLocale != Locale.Default : activity must be recreated in on resume */
    private Locale myLocale = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        fixLocale(this);
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // Locale has changed by other Activity ?
        if ((myLocale != null) && (myLocale.getLanguage() != Locale.getDefault().getLanguage())) {
            myLocale = null;
            recreate();
        }
    }

    /**
     * Set Activity-s locale to SharedPreferences-setting.
     * Must be called before onCreate
     * @param context
     */
    public static void fixLocale(Context context)
    {
        final SharedPreferences prefs = PreferenceManager
                .getDefaultSharedPreferences(context);
        String language = prefs.getString(Global.PREF_KEY_USER_LOCALE, "");
        Locale locale = Global.systemLocale; // in case that setting=="use android-locale"
        if ((language != null) && (!language.isEmpty())) {
            locale = new Locale(language); // overwrite "use android-locale"
        }

        if (locale != null) {
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            Resources resources = context.getResources();
            resources.updateConfiguration(config, resources.getDisplayMetrics());
            // recreate();

            if (context instanceof LocalizedActivity) {
                ((LocalizedActivity) context).myLocale = locale;
            }
        }
    }
}

私の A Photo Manager プロジェクトで使用されているLocalizedActivity.javaSettingsActivity.javaのソースは次のとおりです。

于 2016-01-08T11:00:18.270 に答える
0

解決策は、ロケールを設定した後、 onResume メソッドのすべてのアクティビティで setContentView および controlLanguage (グローバル クラスからこのメソッドを呼び出すこともできます) メソッドを使用することです。例:

@Override
    public void onClick(View v) {
        SharedPreferences.Editor editor;
        editor = sharedPref.edit();
        Configuration config = new Configuration(getBaseContext().getResources().getConfiguration());
        String language = "";
        switch (v.getId()){
            case R.id.turkceButton:
                editor.putString("language", "tr");
                language="tr";
                break;
            case R.id.englishButton:
                editor.putString("language", "en");
                language="en";
                break;
        }
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
        config.locale = locale;
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
        editor.commit();


@Override
    protected void onResume() {
        super.onResume();
        controlLanguage(getApplicationContext(), getResources());
        setContentView(R.layout.main);
    }

public void controlLanguage(Context context, Resources res){
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
        String language = sharedPref.getString("language","en");
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
        res.getConfiguration().locale = locale;
        res.updateConfiguration(res.getConfiguration(), res.getDisplayMetrics());
    }
于 2015-07-13T21:21:39.970 に答える