首页 > 解决方案 > 如何在所有活动中更改我的应用程序的语言?

问题描述

我已经在第一个 Activity 中成功更改了我的应用程序的语言.. 但是通过移动到另一个 Activity,我发现语言没有改变。

请注意,我使用以下代码更改语言

public static final String languageFile="language_file";
SharedPreferences myLang;

private Locale Language;
String defaultLanguage="en";
String language1;

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

    myLang = getSharedPreferences(languageFile, Context.MODE_PRIVATE);
    language1=myLang.getString("language",defaultLanguage).toString();

    setLocale(language1);
}

public void setLocale(String lang) {

    Language = new Locale(lang);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = Language;
    res.updateConfiguration(conf, dm);
    Intent refresh = new Intent(this,Welcome_Activity.class);
    startActivity(refresh);
    finish();
}

我使用了一个对话框来选择语言并将其放入共享首选项中,如下所示

     public void changeLanguage(){
     AlertDialog.Builder builder = new AlertDialog.Builder(this);
     builder
             // .setIcon(android.R.drawable.ic_dialog_alert)
              .setTitle(R.string.LanguageSelector)
              .setMessage(R.string.Pleaseselectyourlanguage)
              .setPositiveButton("English", new 
     DialogInterface.OnClickListener() {
                 @Override
                 public void onClick(DialogInterface dialog, int 
      which) {
                    setLocale("en");

      myLang=getSharedPreferences(languageFile,Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor=myLang.edit();
                    editor.putString("language", "en").apply();

                }
            })
            .setNegativeButton("عربي", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    setLocale("ar");
                    myLang=getSharedPreferences(languageFile,Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor=myLang.edit();
                    editor.putString("language", "ar").apply();


                }
            });
    AlertDialog alert = builder.create();
    alert.show();
    Button nbutton = alert.getButton(DialogInterface.BUTTON_NEGATIVE);
    nbutton.setTextColor(Color.BLACK);
    Button pbutton = alert.getButton(DialogInterface.BUTTON_POSITIVE);
    pbutton.setTextColor(Color.BLACK);
 }

标签: androidsharedpreferenceslocale

解决方案


您所要做的就是创建一个 BaseClass 并使用 Base 类扩展您的所有活动

public class MainActivity  extends BaseActivity  {

   @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

}


/**
 * @author Atif Abbasi .
 */

public class BaseActivity  extends AppCompatActivity {


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }




    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(LocaleHelper.wrap(newBase, AppClass.getLanguage(newBase)));

/**
*save value in sharedPrefrences 
*
*AppClass.getLanguage(newBase)
*
*
**/

    }


    /**
     * A locale helper class for updating app specific locale
     */
    private static class LocaleHelper extends ContextWrapper {

        public LocaleHelper(Context base) {
            super(base);
        }

        public static ContextWrapper wrap(Context context, String language) {
            if (TextUtils.isEmpty(language.trim())) {
                return new LocaleHelper(context);
            }
            Configuration config = context.getResources().getConfiguration();
            Locale locale = new Locale(language);
            Locale.setDefault(locale);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                config.setLocale(locale);
            } else {
                //noinspection deprecation
                config.locale = locale;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                config.setLayoutDirection(locale);
                context = context.createConfigurationContext(config);
            } else {
                //noinspection deprecation
                context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
            }
            return new LocaleHelper(context);
        }

    } // LocaleHelper


}

推荐阅读