Android - 在按钮单击时手动更改应用程序区域设置

时间:2016-08-26 04:11:55

标签: android locale

我想更改应用程序的区域设置(语言),以便在用户想要使用更改语言按钮切换印地语和英语时以编程方式进行更改。

我有一个代码来更改语言,但只有当我在setContentView()方法之前调用活动的onCreate()时它才有效。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:4)

请参阅我的回答

Android Font in more then one langauge on single screen

例如,如果您希望您的应用程序同时支持英语 和阿拉伯字符串(除了默认字符串), 你可以简单地再创建两个 名为/res/values-en的资源目录(对于英文strings.xml)和 /res/values-ar(对于Arabic strings.xml)。

strings.xml个文件中, 资源名称是相同的。

例如,/res/values-en/strings.xml文件可以 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello in English!</string>
</resources>

而/res/values-ar/strings.xml文件看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">مرحبا في اللغة الإنجليزية</string>
</resources>

另外,/ res / values-ur_IN / strings.xml文件对于urdu看起来像这样:

ur_IN for india ur_PK for pakisthan

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">انگریزی میں خوش!!</string>
</resources>

/ res / layout目录中显示字符串的默认布局文件是指 变量名@ string / hello的字符串,不考虑哪种语言或目录 字符串资源在。

Android操作系统决定使用哪个版本 在运行时加载的字符串(法语,英语或默认值)。具有TextView控件的布局 显示字符串可能如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello" >
</LinearLayout>

以正常方式以编程方式访问字符串:

String str = getString(R.string.hello);

要改变你需要改变语言的语言..

btn_english.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Locale locale = new Locale("en"); 
                  Locale.setDefault(locale);
                  Configuration config = new Configuration();
                  config.locale = locale;
                  getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
                  Toast.makeText(this, getResources().getString(R.string.lbl_langSelectEnglis), Toast.LENGTH_SHORT).show();

            }
        });



 btn_arbice.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                 Locale locale = new Locale("ar"); 
                  Locale.setDefault(locale);
                  Configuration config = new Configuration();
                  config.locale = locale;
                  getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
                  Toast.makeText(this, getResources().getString(R.string.lbl_langSelecURdu), Toast.LENGTH_SHORT).show();

            }
        });


 btn_urdu.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Locale locale = new Locale("ur_IN"); 
                  Locale.setDefault(locale);
                  Configuration config = new Configuration();
                  config.locale = locale;
                  getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
                  Toast.makeText(HomeActivity.this, getResources().getString(R.string.lbl_langSelectEnglis), Toast.LENGTH_SHORT).show();

            }
        });

答案 1 :(得分:2)

单击按钮时尝试此功能。

session

答案 2 :(得分:1)

使用SharedPrefrences保存用户首选项并在onStart()中调用语言环境而不是onCreate()。这对我来说很好 定义DEFAULT值,以便您的应用程序不会现金

public static final String Default="en"; //so if value isn't found then english language will be used.


protected void onStart() {
    SharedPreferences sharedPreferences = this.getSharedPreferences("selectedLanguage", Context.MODE_PRIVATE);
    String pine = sharedPreferences.getString("language", DEFAULT);
    String languageToLoad = pine;
    Locale locale = new Locale(languageToLoad);//Set Selected Locale
    Locale.setDefault(locale);//set new locale as default
    Configuration config = new Configuration();//get Configuration
    config.locale = locale;//set config locale as selected locale
    this.getResources().updateConfiguration(config, this.getResources().getDisplayMetrics());
    invalidateOptionsMenu();
    setTitle(R.string.app_name);
    super.onStart();
}

我根据用户选择将sharedPrefrences值设置为hindi或english。我在这种情况下使用了开关。下面你可以看到代码。

aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

            if (aSwitch.isChecked()) {
                SharedPreferences hisharedPreferences = getSharedPreferences("selectedLanguage", Context.MODE_PRIVATE);
                SharedPreferences.Editor hieditor = npsharedPreferences.edit();
                npeditor.putString("language","hi");
                npeditor.commit();
                aSwitch.setChecked(true);
                Toast.makeText(Settings.this, "Hindi Language Selected", Toast.LENGTH_LONG).show();

            } else {
                SharedPreferences ensharedPreferences = getSharedPreferences("selectedLanguage", Context.MODE_PRIVATE);
                SharedPreferences.Editor eneditor = ensharedPreferences.edit();
                eneditor.putString("language","en");
                eneditor.commit();
                Toast.makeText(Settings.this, "English Language Selected", Toast.LENGTH_LONG).show();
                aSwitch.setChecked(false);
            }
        }
    });

希望这有帮助!!如果您遇到困难,请随时问我!

答案 3 :(得分:0)

单击按钮更新应用的区域设置语言后,您可以刷新以下示例的活动以更改用户界面:

OnButtonClicked(){
//it will check for android version.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return updateResources(context, language);
        } 
        return updateResourcesLegacy(context, language);
}
   //after setting language it will update ui
   refreshActivity();
}

public void refreshActivity() throws Exception {
    try {
        // refresh activity for language changes
        Intent intent = getIntent();
        YOUR_ACTIVITY_NAME.this.finish();
        System.out.println("activity finished");
        startActivity(intent);
        System.out.println("starting activity");
    } catch (Exception e) {
        Log.d("RegistrationForm", "application crashed...");
        e.printStackTrace();
    }
}




@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Configuration configuration = context.getResources().getConfiguration();
    configuration.setLocale(locale);
    configuration.setLayoutDirection(locale);


    context.getResources().updateConfiguration(configuration,
            context.getResources().getDisplayMetrics());

    return context.createConfigurationContext(configuration);
}

@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Resources resources = context.getResources();

    Configuration configuration = resources.getConfiguration();
    configuration.locale = locale;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        configuration.setLayoutDirection(locale);
    }

    resources.updateConfiguration(configuration, resources.getDisplayMetrics());

    return context;
}

完成步骤:

  1. 如果Android版本低于N,则单击按钮检查Android版本,然后它将执行区域代码更改的旧代码,即updateResourcesLegacy。否则,如果Android版本为N或N以上,它将执行updateResources()方法。

  2. 通过调用refreshActivity()方法设置语言刷新活动后,该方法将更新用户界面。