android 语言环境和 updateConfiguration 已弃用

标签 android deprecated

我正在为英语和印地语创建多语言应用

下面是我使用的代码,它运行良好,但有些东西已被弃用,请告诉我如何解决它,

弃用的代码是

conf.locale = myLocale;
res.updateConfiguration(conf, dm);

我的全部代码:(这不是完整的代码,我只是向您展示主要部分)

 private  Intent intent;
    private Locale myLocale;
    private  Resources res;
    private DisplayMetrics dm;
    private Configuration conf;

switch(lang)
                    {
                        case "no_lang":

                            editor = preferences.edit();
                            editor.putString("set_language","en");
                            editor.commit();

                            myLocale = new Locale("en");
                            res = getResources();
                            dm = res.getDisplayMetrics();
                            conf = res.getConfiguration();
                            conf.locale = myLocale;
                            res.updateConfiguration(conf, dm);
                            intent = new Intent(SplashActivity.this, MainActivity.class);
                            startActivity(intent);
                            finish();
                            break;
                        case "en":

                            editor = preferences.edit();
                            editor.putString("set_language","en");
                            editor.commit();

                            myLocale = new Locale("en");
                            res = getResources();
                            dm = res.getDisplayMetrics();
                            conf = res.getConfiguration();
                            conf.locale = myLocale;
                            res.updateConfiguration(conf, dm);
                            intent = new Intent(SplashActivity.this, MainActivity.class);
                            startActivity(intent);
                            finish();
                            break;
                        case "hi":
                            editor = preferences.edit();
                            editor.putString("set_language","hi");
                            editor.commit();

                            myLocale = new Locale("hi");
                            res = getResources();
                            dm = res.getDisplayMetrics();
                            conf = res.getConfiguration();
                            conf.locale = myLocale;
                            res.updateConfiguration(conf, dm);
                            intent = new Intent(SplashActivity.this, MainActivity.class);
                            startActivity(intent);
                            finish();
                            break;
                    }

我点击了这些链接,但我不明白... link1 , link2

最佳答案

好的,我用 this answer 解决了它@Bassel Mourjan 的

我有一个基本 Activity ,剩下的是 fragment ,下面是我的代码 (我在 android 7.1.1 (genymotion emu) 中测试了这段代码并且它有效)

从上面的链接中查看(使用)MyContextWrapper 类。

在我的 MainActivity 中单击按钮我正在为该 Activity 的结果打开 Activity 我正在获取用户选择的语言,例如:英语,印地语,马拉地语

主要 Activity :

     // i use shared preference to save my language so that when user close 
       //app and open it, then his previous language will be set
            @Override
            public void attachBaseContext(Context newBase)
            {
                SharedPreferences preferences1 = newBase.getSharedPreferences("global",newBase.MODE_PRIVATE);
                String lang=preferences1.getString("set_language","en"); // at start no language selected so default is english
                super.attachBaseContext(MyContextWrapper.wrap(newBase,lang));
            }



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

            navigation_header_language.setOnClickListener(this);//Language button
    }

       @Override
        public void onClick(View v)
        {

            switch (v.getId())
            {
              case R.id.navigation_header_language:

                    Intent i = new Intent(this, LanguageActivity.class);
                    startActivityForResult(i, 101);

                    break;
            }
        }

// when user selects language i store it in shared preference and set result 
// as RESULT_OK and here in onActivityResult's result_ok i simply recreate activity 
//so that attachBaseContext called again and language set as we want
      @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == 101) {
                if(resultCode == Activity.RESULT_OK)
                {
                    this.recreate();
                }

                if (resultCode == Activity.RESULT_CANCELED) {
                    //Write your code if there's no result
                }
            }
        }

这里是 LanguageActivity,这是我从主要 Activity 调用的结果

      public class LanguageActivity extends AppCompatActivity
        {
            private CardView english_language,hindi_language,marathi_language;
            private SharedPreferences preferences;
            private SharedPreferences.Editor editor;

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

                english_language=(CardView)findViewById(R.id.english_language);
                hindi_language=(CardView)findViewById(R.id.hindi_language);
                marathi_language=(CardView)findViewById(R.id.marathi_language);

                preferences =getSharedPreferences("global",MODE_PRIVATE);

                english_language.setOnClickListener(new View.OnClickListener()
                {
                    @Override
                    public void onClick(View v)
                    {
                        editor = preferences.edit();
                        editor.putString("set_language","en");
                        editor.commit();
                        setResultCode();
                    }
                });

                hindi_language.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v)
                    {
                        editor = preferences.edit();
                        editor.putString("set_language","hi");
                        editor.commit();
                        setResultCode();
                    }
                });

                marathi_language.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v)
                    {
                        editor = preferences.edit();
                        editor.putString("set_language","mr");
                        editor.commit();
                        setResultCode();
                    }
                });
            }

            private void setResultCode()
            {   
                Intent returnIntent = new Intent();
                setResult(Activity.RESULT_OK,returnIntent);
                finish();
 // when this activity close, onActivityResult method call from Mainactivity
//and there i used this.recreate() which will recreate mMainactivity an
//attachBaseContext will be called once again
            }
        }

关于android 语言环境和 updateConfiguration 已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42535958/

相关文章:

android - com.google.android.gms.location.LocationListener 和 android.location.LocationListener 之间有什么区别?

java - 即使调用者 Activity 被销毁,短时间运行的 Android 后台任务也可以安全地被忽略,对吗?

java - 带有@Deprecated 注释的类意味着所有方法和字段都将自动弃用

ruby-on-rails - 当遇到过时警告时,如何配置Rails引发错误?

java - fragment getActivity() 与接口(interface)回调?

android - 录制时逐帧处理Android视频

android - AppBarLayout fitsSystemWindows true attr 使 CircularIndicator 不可见

PhpStorm:不建议使用类名进行调用

Groovy:在这些情况下如何替换 leftShift 运算符?

ios - 不推荐使用 initForReadingWithData - initForReadingFromData 返回 nil