如何在android中以编程方式改变应用程序的语言?

yduiuuwa  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(463)

这个问题在这里已经有了答案

如何只需单击一下就可以更改整个应用程序的语言(1个答案)
昨天关门了。
我想通过字符串改变应用程序的语言。
这是我的字符串文件夹

pdkcd3nj

pdkcd3nj1#

我想通过字符串改变应用程序的语言。
这是我这边的。这对我来说非常合适。
按照以下步骤更改语言。
1.将字符串保存在文件夹中,如values ur(乌尔都语)

而不是将所有字符串转换为您必须转换的语言
2.创建一个baseactivity类,并将您的所有休息活动扩展到该基类

public class BaseActivity extends AppCompatActivity
{
    public BaseActivity context;
    public MySharePreference mySharePreference;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        context = BaseActivity.this;
        mySharePreference = MySharePreference.getInstance(context);
        LocaleHelper.setLocale(context, mySharePreference.getLanguage() );
    }

    protected void attachBaseContext(Context base)
    {
        super.attachBaseContext(LocaleHelper.onAttach(base));
    }

}

3.我有一个活动,我想翻译它的语言。

public class ExampleActivity extends BaseActivity {

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

只需将应用程序扩展到baseactivity类。
3.创建一个localhelper类,在其中更改方向和字符串。

public class LocaleHelper
{

    public static Context setLocale(Context context, String language)
    {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Resources resources = context.getResources();

        Configuration configuration = new Configuration(resources.getConfiguration());
        configuration.setLayoutDirection(locale);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
        {
            configuration.setLocale(locale);
            LocaleList localeList = new LocaleList(locale);
            LocaleList.setDefault(localeList);
            configuration.setLocales(localeList);
        }
        else
        {
            configuration.locale = locale;
            configuration.setLocale(locale);
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1)
        {
            return context.createConfigurationContext(configuration);
        }
        else
        {
            resources.updateConfiguration(configuration, resources.getDisplayMetrics());
            return context;
        }
    }

    public static Context onAttach(Context context)
    {
        return setLocale(context, MySharePreference.getInstance(context).getLanguage());
    }
}

4.在应用程序类中附加基本上下文

public class AppClass extends MultiDexApplication
{

    private static AppClass appClass;
    public static AppClass getintance()
    {
        return appClass;
    }

    @Override
    public void onCreate()
    {
        super.onCreate();
        appClass = this;
        MySharePreference.getInstance(this);
    }

    @Override
    protected void attachBaseContext(Context base)
    {
        super.attachBaseContext(LocaleHelper.onAttach(base));
    }

}

5.在build.gradle文件中添加最新的androidx SharedReferences依赖项。

implementation 'androidx.preference:preference:1.1.1'

6.在我的情况下,我自己做了一个sharedpreferences类。

public class MySharePreference
{
    private static MySharePreference instance;
    private static SharedPreferences pref;

    private MySharePreference(Context context)
    {
        if (context != null)
        {
            pref = PreferenceManager.getDefaultSharedPreferences(context);
        }
        else
        {
            pref = PreferenceManager.getDefaultSharedPreferences(App.getintance());
        }
    }

    public static MySharePreference getInstance(Context context)
    {
        if (instance == null || pref == null)
        {
            instance = new MySharePreference(context);
        }
        return instance;
    }

    public String getLanguage()
    {
        return pref.getString("appLanguage", "en");
    }

    public void setLanguage(String b)
    {
        pref.edit().putString("appLanguage", b).apply();
    }
}

7.最后将该语言的缩写保存到sharedpreferences,在我的例子中,我有spinner。

spinner_lang.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
            {
                if (mySharePreference.getLanguagePosition() != position)
                {
                    mySharePreference.setLanguage(Constants.COUNTRY_LIST.get(position).countryAbbr);
                    mySharePreference.setLanguagePosition(position);
                    startActivity(new Intent(mActivity, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent)
            {

            }
        });

现在一切都结束了。。。。。。

相关问题