Android Locale和updateConfiguration已经被弃用。

3

我正在创建一个英语和印地语的多语言应用程序。

我使用了以下代码,它完美地运行了,但其中一些内容已经过时了,请告诉我如何解决它,

过时的代码如下:

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;
                    }

我按照以下链接,但是还是不太明白... 链接1, 链接2

1个回答

1

我通过使用 @Bassel Mourjan 的 这个答案 解决了它。

我有一个基础活动和其他是片段,以下是我的代码(我在 Android 7.1.1(genymotion emu)中测试了此代码并且它可以工作)

请参见(使用)上面链接中的 MyContextWrapper 类。

在我的 MainActivity 中,当用户点击按钮时,我会打开一个 Activity 以获取用户选择的语言,例如:英语、印地语、马拉地语。

MainActivity:

     // 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,我从主活动中调用它以获取结果。

      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
            }
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接