效果图:
demo下载:
android多语言切换 - 下载频道 - CSDN.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(^__^)