最近在项目中遇到了一个问题,需要自己去调整整个应用的语言选择以及对应的时钟的问题,网上找了一些资料发现有一些坑以及问题,自己在这里记录下来 这里产生的问题都是在单Activity的架构下存在的.
1.调整应用内的语言选择
在Android的API 25中,getResources().updateConfiguration() 你会发现已经过时了,不建议使用了。所以我也不记录这个操作了… 要看到现在推荐的是 createConfigurationContext 这个方法,但是你直接使用之后发现还是没有什么锤子用。
然后看了一堆注释和找资料发现需要将actiivty的attachBaseContext方法进行复写…
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase.createConfigurationContext(GetLanguageConfiguration(newBase)));
}
public Configuration GetLanguageConfiguration(Context mContext){
Configuration ChooseConfiguration = new Configuration();
Locale ChooseLocale = Locale.CHINA; //这里去改变为你自己的语言
ChooseConfiguration.setLocale(ChooseLocale);
return ChooseConfiguration;}
这样就可以根据你所选择的Locale去改变了你想成为的语言.这是刚进入App时去选择语言,那如果要根据按钮选择语言咋整? 我们根据方法名很容易知道attachBaseContext 是会直接影响我们的BaseContext的.如果重新调用该方法会导致Activity的BaseContext发生改变,这是不允许的. 那咋整呢,那只能改变语言的时候调用recreate() 了…让activity重新创造和初始化,这时候就注意自己的初始化的操作问题即可.
2.根据应用内语言选择对应时区
因为项目中有一个时钟,而时钟应该对应你的语言选择的时钟,
//获得你现在配置中使用的语言
String NowConfigurationLanguage = context.getResources().getConfiguration().getLocales().get(0).getLanguage();
//自己写的一个Map,根据语言选择时区
String StringTimeZone = Language_With_TimeZone.get(NowConfigurationLanguage);
//根据String获得对应对象
TimeZone ClockTimeZone = TimeZone.getTimeZone( StringTimeZone );
TextClock.setTimeZone(ClockTimeZone.getId());
public final static Map<String, String> Language_With_TimeZone = new HashMap<>(64);
static {
Language_With_TimeZone.put("zh", "GMT+8:00");
Language_With_TimeZone.put("en", "GMT-4:00");
Language_With_TimeZone.put("jp", "GMT+9:00");
Language_With_TimeZone.put("ko", "GMT+9:00"); //韩国
Language_With_TimeZone.put("spa", "GMT+1:00"); //西班牙 ca_es
Language_With_TimeZone.put("dut", "GMT+1:00"); //荷兰 Nl
Language_With_TimeZone.put("it", "GMT+1:00"); //意大利
Language_With_TimeZone.put("fr", "GMT+1:00"); //法国
Language_With_TimeZone.put("de", "GMT+1:00"); //德国
Language_With_TimeZone.put("slv", "GMT+1:00"); //斯洛文尼亚
}
3.TextClock的24小时制 TextClock是一个很好用的文本时钟选项,并且可以设置该格式的一个东西. 24小时制则使用
TextClock.setFormat24Hour(“HH:mm”)
注意一定要大写的HH,否则会变成12小时制的
12小时制则为
TextClock.setFormat24Hour(“aa hh:mm”)
aa为 am/pm的标识符 hh为小时 mm为分钟. 如果要自己造的话需要小心的点需要在自己的String前添加’ 单引号是用来嵌套自己的自定义的String的…
TextClocksetFormat12Hour("’"+ monthName + “'dd日 '” + dayName+ “’”);
原理我没有去看,希望有一个好心人能告诉我一下…好像是跟有/无效转义有关.
|