Android多语言,应用内切换语言

当应用面向的是不同国家的用户时,需要做国际化。国家化通常包括文字和图片,本文只讲文字。如果不需要在应用内对用户提供国家区域的切换,那么只要多建几个values文件夹,每个文件夹下新建一个string.xml文件,由系统来解决调用那个string.xml文件即可。如果需要在应用内对用户提供国家区域的切换,那么就要在应用内去告诉系统该调用哪个string.xml的内容进行展示了。

实现起来还是比较简单的,只需要调用系统updateConfiguration方法,传入一个Configuretion参数一个DisplayMetrics参数即可,Configuretion用于告诉系统,你指定的国家区域是哪个。

 Configuration configuration = getResources().getConfiguration();
 DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
 configuration.locale = Locale.ENGLISH;
 getResources().updateConfiguration(configuration, displayMetrics);


 
  

做完以上操作,需要重启APP:

  //刷重启APP
  Intent intent = new Intent();
  //跳到启动页面是因为在APP重启时,如果直接跳到本页面,会有一个短暂的黑屏,其实跳到启动页面也有点违和,这个就需要设计来搞定了
  intent.setClass(LanguageChange.this,LaunchActivity.class);
 LanguageChange.this.startActivity(intent);
 android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(0);



好啦,这么弄完是不是发现。。。。。。。。。。。。。并没有什么效果啊,哈哈,那是当然的,更新完语言之后才去重启应用,当然不起效果。所以updateConfiguration得放在应用启动之时,那么最好的方式就是放在自定义的Application中。咋知道在application中指定哪个语言呢?在用户选择完所要展示的语言之后,将用户的选择结果放到共享参数中保存起来,在Application的onCreate方法中再将结果拿出来,再设置configuration.locale,最后updateConfiguration就ok了。

以下是实现代码:

(1)保存用户选择的结果,重启应用

public class LanguageChange extends AppCompatActivity {
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_language_change);
        textView = (TextView) findViewById(R.id.tv_change);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int curLanguage = SaveLanguaeInfo.getLanguage(LanguageChange.this);
                        Configuration configuration = getResources().getConfiguration();
                DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
                if (curLanguage == 0 || curLanguage == 1) {
                    curLanguage = 2;
                    configuration.locale = Locale.ENGLISH;
                } else {
                    curLanguage = 1;
                    configuration.locale = Locale.CHINA;
                }
                SaveLanguaeInfo.saveLanguage(LanguageChange.this, curLanguage);

                /*接下来需要刷新页面,我采用重启APP的方式
                  试了采用
                  getResources().updateConfiguration(configuration, displayMetrics);
                  intent.setClass(LanguageChange.this,LanguageChange.class);
                  intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                  只刷新本页面的方式,然而没成功
                * */

                //刷重启APP
                Intent intent = new Intent();
                //跳到启动页面是因为在APP重启时,如果直接跳到本页面,会有一个短暂的黑屏,其实跳到启动页面也有点违和,这个就需要设计来搞定了
                intent.setClass(LanguageChange.this,LaunchActivity.class);
                LanguageChange.this.startActivity(intent);
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(0);
            }
        });
    }
}



(2)在application中进行资源设置,别忘了在AndroidManifest中使用该application

public class MainApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //1 是中文 2是英文
        int curLanguage = SaveLanguaeInfo.getLanguage(this);
        Configuration configuration = getResources().getConfiguration();
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        if (curLanguage == 2) {
            configuration.locale = Locale.ENGLISH;
        } else {
            configuration.locale = Locale.CHINA;
        }
        getResources().updateConfiguration(configuration, displayMetrics);
    }
}



(3)使用共享参数存取用户的选择结果

public class SaveLanguaeInfo {
    public  static  void  saveLanguage(Context context,int tag){
        SharedPreferences sharedPreferences = context.getSharedPreferences("language",Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putInt("change",tag);
        editor.commit();
    }

    public static  int getLanguage(Context context){
        SharedPreferences sharedPreferences = context.getSharedPreferences("language",Context.MODE_PRIVATE);
        return sharedPreferences.getInt("change",0);
    }
}


 
  
(4)需要在AndroidManifest的application中指定configChanges属性为locale

 






你可能感兴趣的:(Android)