Android之应用内部实现国际化
这篇文章也提供了应用内部转换语言的方法: http://blog.csdn.net/sodino/article/details/6596709 。
1和2的方法是一样的,然而还是会调整了手机的语言设置
3对于大型应用来说显得有点儿笨重
针对于这两种程况,我也提供一种方法,即能在不改变手机设置的前提下,又能在大型项目上显得不会太笨重。直接上代码:
工具类:
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.preference.PreferenceManager;
import android.util.DisplayMetrics;
import java.util.Locale; public class LanguageSettingUtil {
//单例模式-
private static LanguageSettingUtil instance;
private Context context;
//存储当前系统的language设置-
private String defaultLanguage;
//存储当前系统Locale-
private Locale defaultLocale;
public final static String ENGLISH = "en";
public final static String CHINESE = "zh"; private LanguageSettingUtil(Context paramContext) {
//得到系统语言-
Locale localLocale = Locale.getDefault();
this.defaultLocale = localLocale; //保存系统语言到defaultLanguage
String str = this.defaultLocale.getLanguage();
this.defaultLanguage = str; this.context = paramContext;
} //检验自身是否被创建-
public static LanguageSettingUtil get() {
if (instance == null)
throw new IllegalStateException(
"language setting not initialized yet");
return instance;
} //初始化-
public static void init(Context paramContext) {
if (instance == null) {
instance = new LanguageSettingUtil(paramContext);
}
} // 创建Configuration-
private Configuration getUpdatedLocaleConfig(String paramString) { Configuration localConfiguration = context.getResources()
.getConfiguration();
Locale localLocale = getLocale(paramString);
localConfiguration.locale = localLocale;
return localConfiguration;
} //得到APP配置文件目前的语言设置-
public String getLanguage() {
SharedPreferences localSharedPreferences = PreferenceManager
.getDefaultSharedPreferences(this.context);
//如果当前程序没有设置language属性就返回系统语言,如果有,就返回以前的-
return localSharedPreferences.getString("language",
this.defaultLanguage);
} //如果配置文件中没有语言设置-
public Locale getLocale() {
String str = getLanguage();
return getLocale(str);
} //创建新Locale并覆盖原Locale-
public Locale getLocale(String paramString) {
Locale localLocale = new Locale(paramString);
Locale.setDefault(localLocale);
return localLocale;
} //刷新显示配置-
public void refreshLanguage() {
String str = getLanguage();
Resources localResources = this.context.getResources();
if (!localResources.getConfiguration().locale.getLanguage().equals(str)) {
Configuration localConfiguration = getUpdatedLocaleConfig(str);
// A structure describing general information about a display, such
// as its size, density, and font scaling.
DisplayMetrics localDisplayMetrics = localResources
.getDisplayMetrics();
localResources.updateConfiguration(localConfiguration,
localDisplayMetrics);
}
} //设置系统语言-
public void saveLanguage(String paramString) {
PreferenceManager.getDefaultSharedPreferences(this.context).edit()
.putString("language", paramString).commit();
} //保存系统的语言设置到SharedPreferences-
public void saveSystemLanguage() {
PreferenceManager.getDefaultSharedPreferences(this.context).edit()
.putString("PreSysLanguage", this.defaultLanguage).commit();
} public void checkSysChanged(String cuerSysLanguage) {
//如果系统语言设置发生变化-
if (!cuerSysLanguage.equals(PreferenceManager
.getDefaultSharedPreferences(this.context).getString(
"PreSysLanguage", "zh"))) {
//如果系统保存了this对象,就在这里修改defaultLanguage的值为当前系统语言cuerSysLanguage
this.defaultLanguage = cuerSysLanguage;
saveLanguage(cuerSysLanguage);
saveSystemLanguage();
}
}
}
调用类:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.internationaltest.util.LanguageSettingUtil; public class MainActivity extends Activity { private LanguageSettingUtil languageSetting;
private TextView h,w;
private Button b;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); h = (TextView) findViewById(R.id.h);
w = (TextView) findViewById(R.id.w);
b = (Button) findViewById(R.id.b); LanguageSettingUtil.init(this); // 初始化
languageSetting = LanguageSettingUtil.get(); // 检查是否已经初始化
} public void change(View view){
languageSetting.saveLanguage("en"); // 设置为"en"语言
LanguageSettingUtil.get().refreshLanguage(); // 刷新
h.setText(R.string.hello);
w.setText(R.string.world);
b.setText(R.string.change);
}
}
Android之应用内部实现国际化的更多相关文章
- Android 文件夹命名规范 国际化资源
Android 文件夹命名规范 国际化资源 android多国语言文件夹文件汇总如下: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values- ...
- 今天给大家分享一下Android中的资源与国际化的问题
摘要:该文章将向大家分享Android中的资源与国际化的问题. 今天给大家分享一下Android中的资源与国际化的问题,通常我们新建一个Android工程,目录结构如下图所示: 我们主要看一下layo ...
- Android SDCard和内部存储中gcc编译后的可执行文件无法运行提示 cannot execute - Permission denied
原因是mount的方式问题,root后运行 su mount -o rw,remount /mnt/sdcard //SDCard mount -o rw,remount /mnt/interna ...
- Android中的资源与国际化!
Android中的资源与国际化的问题,通常我们新建一个Android工程,目录结构如下图所示: 我们主要看一下layout与values目录,layout里的xml文件的我们应用使用布局的文件,val ...
- android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- eclipse中如何查看一个android模拟器的内部文件
eclipse中如何查看一个android模拟器的内部文件,有时要在其中添加一个文件夹或是什么的,要手动的做这件事,而不能够用代码去完成时,就要用这个方法了. 1.首先,打开一个安卓模拟器. 2.这个 ...
- 彻底了解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- 彻底理解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6703247 上文介绍了Android应用程序的 ...
随机推荐
- java8 - 4
import java.io.PrintStream; import java.util.Comparator; import java.util.function.BiFunction; impor ...
- 【LOJ】#2070. 「SDOI2016」平凡的骰子
题解 用了一堆迷之复杂的结论结果迷之好写的计算几何???? 好吧,要写立体几何了 如果有名词不懂自己搜吧 首先我们求重心,我们可以求带权重心,也就是x坐标的话是所有分割的小四面体的x坐标 * 四面体体 ...
- USACO 6.4 Electric Fences
Electric FencesKolstad & Schrijvers Farmer John has decided to construct electric fences. He has ...
- (转)python的range()函数用法
使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的slide,最后分析一个好玩儿的冒泡程序. 转自: ...
- 转 Java高级程序员面试题
1.你认为项目中最重要的过程是那些? 分析.设计阶段 尽量找出进度的优先级 2.如果给你一个4-6人的team,怎么分配? 挑选一技术过硬的人作为我的替补.其它人平均分配任务,每周进行全面的任务分配 ...
- TCP流嗅探和连接跟踪工具tcpick
TCP流嗅探和连接跟踪工具tcpick 由于网络通信协议众多,TCP连接状态众多,所以TCP分析较为复杂.Kali Linux提供一款专用工具tcpick.该工具支持在线实时嗅探和离线文件嗅探.它 ...
- DNS隧道工具iodine
DNS隧道工具iodine 在受限制的网络中,如果DNS请求没有被限制,就可以通过DNS请求建立隧道而突破网络限制.iodine是Kali Linux提供的一款DNS隧道工具.该工具分为服务器端i ...
- Highmaps网页图表教程之图表配置项结构与商业授权
Highmaps网页图表教程之图表配置项结构与商业授权 Highmaps图表配置项结构 Highmaps最核心的部分就是图表配置项.用户通过图表配置项来对标题进行定制,从而实现自己所要的效果.所以,掌 ...
- 模拟Djangoweb框架
一.需求 1.访问127.0.0.1/login,访问到login页面 2.登陆成功,跳转到登陆后的页面 3.登陆失败,跳转到登陆失败的页面 4.用户账号密码验证 二.目录结构 三.代码 day01. ...
- BZOJ 4945 UOJ #317 NOI2017 游戏 2-SAT 拓扑排序
http://uoj.ac/problem/317 https://www.lydsy.com/JudgeOnline/problem.php?id=4945 我现在的程序uoj的额外数据通过不了,b ...