效果图:
demo下载:
android多语言切换 - 下载频道 - .NET http://download.csdn.net/detail/baidu_31093133/9775830
核心代码:
//获取资源 Resources resources = getResources(); //获取配置 Configuration configuration = resources.getConfiguration(); //获取屏幕 DisplayMetrics dm = resources.getDisplayMetrics(); switch (language) { case "zh": //设置语言 configuration.locale = Locale.SIMPLIFIED_CHINESE; break; case "en": configuration.locale = Locale.ENGLISH; break; default: configuration.locale = Locale.ENGLISH; break; } //更新语言 resources.updateConfiguration(configuration, dm);如何让配置立即生效呢?
我们在设置页面修改了默认的语言配置之后,销毁所有的activity并重启MainActivity,他就会重新加载资源文件。语言修改就生效了。
问题:销毁所有的Activity 自定义一个Application类,初始化一个list,将每一个activity都加入到这个list,销毁所有activity就遍历这个List,逐一调用finish方法即可。
建立一个BaseActivity,所有的Activity都继承自BaseActivity,在onCreate方法里把activity加入lIst,在onDestroy方法里移除activity 在onResume方法里,判断当前保存的语言是中文还是英文,如果是英文就加载英文资源,中文就加载中文资源。
以下是代码:
App.java
public class App extends Application { private static Context mContext; private static App sInstance; public static int SCREEN_WIDTH; //用List来保存每一个activity private List<Activity> mActivities = new LinkedList<Activity>(); @Override public void onCreate() { super.onCreate(); init(); } private void init() { mContext = getApplicationContext(); sInstance = this; ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); Point screen = new Point(); SCREEN_WIDTH = Math.min(screen.x, screen.y); } public static Context getContext() { if (mContext == null) { throw new NullPointerException("App Context is Null"); } return mContext; } public static App getInstance() { if (sInstance == null) { throw new NullPointerException("App sInstance is Null"); } return sInstance; } /** * 获得当前进程的名字 * * @param context * @return */ public static String getCurProcessName(Context context) { int pid = android.os.Process.myPid(); ActivityManager activityManager = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo appProcess : activityManager .getRunningAppProcesses()) { if (appProcess.pid == pid) { return appProcess.processName; } } return null; } //关闭所有Activity public void addActivity(Activity activity) { mActivities.add(activity); } //移除Activity public void removeActivity(Activity activity) { mActivities.remove(activity); } public void exit() { try { for (Activity ac : mActivities) { if (ac != null) { ac.finish(); } } } catch (Exception e) { e.printStackTrace(); } } @Override public void onLowMemory() { super.onLowMemory(); System.gc(); } }BaseActivity.java
public abstract class BaseActivity extends AppCompatActivity { //防止重复点击 private long lastClickTime; private Context ctx; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ctx = this; App.getInstance().addActivity(this); initContentView(); initViews(); } @Override public void setContentView(@LayoutRes int layoutResID) { super.setContentView(layoutResID); ButterKnife.bind(this); } @Override public void setContentView(View view) { super.setContentView(view); ButterKnife.bind(this); } @Override public void setContentView(View view, ViewGroup.LayoutParams params) { super.setContentView(view, params); ButterKnife.bind(this); } /** * 初始化布局 */ protected abstract void initContentView(); /** * 初始化View */ protected abstract void initViews(); private boolean isFastDoubleClick() { long time = System.currentTimeMillis(); long timeD = time - lastClickTime; if (0 < timeD && timeD < 500) { // LogUtil.i("main fast click"); return true; } lastClickTime = time; return false; } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { if (isFastDoubleClick()) { return true; } } return super.dispatchTouchEvent(ev); } public Context getCtx() { return ctx; } @Override protected void onResume() { super.onResume(); String language = (String) SPUtil.get(ctx, "language", ""); Locale locale = Locale.getDefault(); String defaultLanguage = locale.getLanguage(); if (!language.equals(defaultLanguage)) { showLanguage(language); } } private void showLanguage(String language) { Log.i("LHD", "选择的语言: " + language); Resources resources = getResources(); Configuration configuration = resources.getConfiguration(); DisplayMetrics dm = resources.getDisplayMetrics(); switch (language) { case "zh": configuration.locale = Locale.SIMPLIFIED_CHINESE; break; case "en": configuration.locale = Locale.ENGLISH; break; default: configuration.locale = Locale.ENGLISH; break; } resources.updateConfiguration(configuration, dm); SPUtil.put(getCtx(), "language", language); } @Override protected void onDestroy() { super.onDestroy(); App.getInstance().removeActivity(this); } }其它代码请参考demo(^__^)