最近做了一个项目,其中有个视频和图片需要添加各种水印(日期,地点,经纬度,用户ID,产品ID等)问题,而且水印还要支持中英文自动切换显示。功能设计和实现算是比较顺利。昨天测试部给了一个小Bug,那就是在英文环境下,视频预览界面水印能正常显示英文,但通过拍照所获得的图片上的水印却显示为中文!而添加水印这一块代码是完全一样的啊?问题出在哪呢?

经过反复测试,没有发现代码有明显问题。于是凭直觉,就想难道是context上下文不同有关?于是检查代码发现context确实不同,在Activity View下的Context下,水印英文是可以自动切换过去的,而在Application的Context下水印只能显示中文!那么这两个context究竟有何不同呢?

这是两种不同的context:
1.  Application context的生命周期与Application的生命周期相关的,context随着Application的销毁而销毁,伴随application的一生,与activity的生命周期无关.
2. Activity中的context跟Activity的生命周期是相关的,但是对一个Application来说,Activity可以销毁几次,那么属于Activity的context就会销毁多次.
3. 可以通过Activity的context获得Application context,可以通过Context.getApplicationContext 或者 Activity.getApplication方法获取。

由于context引起内存泄漏的常见场景:
1.  错误的单例模式
2. View持有Activity引用

注意事项:使用context的时候,小心内存泄露,防止内存泄露!
1. 不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的 ;
2. 对于生命周期长的对象,可以使用application context;
3. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化。

详细参见:

【简书】https://www.jianshu.com/p/4f97baa0e8f7
【简书】https://www.jianshu.com/p/94e0f9ab3f1d //Context作用域以及引起内存泄漏的场景
【csdn】https://blog.csdn.net/u014639129/article/details/52741497
 
补充:android app多语言切换的功能实现步骤:
1. 要把你原本的string.xml里面的string翻译成英语,需要新建一个文件夹values-en 放在资源文件夹res下面, 如下图所示,其他的语言种类也诸如此类。

2. 将包含相同name字段的英文内容的string.xml放入values-en目录下即可。一般情况下,系统会根据当前上下文自动切换调用相关的字段内容显示,即中文环境调用默认的values目录下的string.xml,英文环境会调用values-en目录下的stirng.xml,实现自动切换效果。

3. 手动显式的调用如下函数切换(本人尚未测试,仅供参考):

public void updateLanguage(Locale locale)
{
  try
  {
    Object objIActMag;
    Class<?> clzIActMag = Class.forName("android.app.IActivityManager");
    Class<?> clzActMagNative = Class.forName("android.app.ActivityManagerNative");
    Method mtdActMagNative$getDefault = clzActMagNative.getDeclaredMethod("getDefault");
    objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);
    Method mtdIActMag$getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration");
    Configuration config = (Configuration) mtdIActMag$getConfiguration.invoke(objIActMag);
    config.locale = locale;
    Class[] clzParams = { Configuration.class };
    Method mtdIActMag$updateConfiguration = clzIActMag.getDeclaredMethod("updateConfiguration", clzParams); 
    mtdIActMag$updateConfiguration.invoke(objIActMag, config);
  } catch (Exception e) {
    e.printStackTrace();
  }

}

然后,调用它进行切换:

com.android.internal.app.LocalePicker.updateLocale(Locale.ENGLISH );

直接通过反射获取到系统设置语言那个类(LocalePicker),执行类里的updateLocale(Locale locale)这个方法传入语言设置更新系统语言。简单粗暴。
 
注意:需要权限
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
 
参见:
https://blog.csdn.net/xiaxiayige/article/details/45666359
 

Android UI中英文自动显示问题的更多相关文章

  1. Android UI设计

    Android UI设计--PopupWindow显示位置设置 摘要: 当点击某个按钮并弹出PopupWindow时,PopupWindow左下角默认与按钮对齐,但是如果PopupWindow是下图的 ...

  2. Android 高级UI设计笔记17:Android在非UI线程中显示Toast

    1. 子线程的Toast怎么显示不出来? 因为Toast在创建的时候会依赖于一个Handler,并且一个Handler是需要有一个Looper才能够创建,而普通的线程是不会自动去创建一个Looper对 ...

  3. 自动显示隐藏布局的listView

    借助View的OnTouchListener接口来监听listView的滑动,通过比较与上次坐标的大小,判断滑动方向,并通过滑动方向来判断是否需显示或者隐藏对应的布局,并且带有动画效果. 1.自动显示 ...

  4. Android UI系列-----时间、日期、Toasts和进度条Dialog

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  5. Android UI组件----ListView列表控件详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  6. 详解 “Android UI”设计官方教程

    我们曾经给大家一个<MeeGo移动终端设备开发UI设计基础教程>,同时很多朋友都在寻找Android UI开发的教程,我们从Android的官方开发者博客找了一份幻灯片,介绍了一些Andr ...

  7. 【转】Android UI系列-----时间、日期、Toasts和进度条Dialog

    原文网址:http://www.cnblogs.com/xiaoluo501395377/p/3421727.html 您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注 ...

  8. android UI进阶之用【转】

    android UI进阶之用ViewPager实现欢迎引导页面 摘要: ViewPager需要android-support-v4.jar这个包的支持,来自google提供的一个附加包.大家搜下即可. ...

  9. 【转】Android UI 五种布局

    在一个Android应用中,Layout是开发中的一个很重要环节,Layout是组成UI不可缺少的一部分. ## Android UI 核心类 在Android应用构建UI的方法有以下几种: 单纯使用 ...

随机推荐

  1. 孔雀翎----《Programming C# 》中国版 文章4版

    孔雀翎----<Programming C# >中国版 文章4版 页:http://blog.csdn.net/21aspnet/           时间:2007.8.7 电子工业出版 ...

  2. Misultin, Mochiweb, Cowboy, NodeJS 及 Tornadoweb测评

    http://www.oschina.net/translate/a-comparison-between-misultin-mochiweb-cowboy-nodejs-and-tornadoweb ...

  3. CentOS 配置远程主机ssh免密登录

    ssh针对的是用户不是机器,同一机器不同用户需要单独配置ssh,才能实现该用户的免密登录 cd ~ cd ./.ssh 在./ssh目录下生成公钥与私钥(如果没有.ssh先使用ssh命令连接到一台远程 ...

  4. 数据集成工具Teiid Designer的环境搭建

    由于实验室项目要求的关系,看了些数据汇聚工具 Teiid 的相关知识.这里总结下 Teiid 的可视化配置工具 Teiid Designer 的部署过程. 背景知识 数据集成是把不同来源.格式.特点性 ...

  5. 自己动手编写一个VS插件(五)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 继续编写VisualStudio插件.这次我编写的插件叫DevAssist(意思是开发助手).在看了前面的文章之后你知 ...

  6. phpcms视图查询数据

    {pc:get sql="SELECT * FROM phpcms WHERE id in ($id) ORDER BY listorder ASC LIMIT 0, 1--"re ...

  7. 查看系统中安装了那些dotnet core 的SDK和运行时的命令

    原文:查看系统中安装了那些dotnet core 的SDK和运行时的命令 1.查看SDK dotnet --list-sdks 2.查看运行时 dotnet --list-runtimes 效果如下图 ...

  8. Codeforces 385 D Bear and Floodlight

    主题链接~~> 做题情绪:时候最后有点蛋疼了,处理点的坐标处理晕了.so~比赛完清醒了一下就AC了. 解题思路: 状态压缩DP ,仅仅有 20 个点.假设安排灯的时候仅仅有顺序不同的问题.全然能 ...

  9. 用 AJAX 读取xml 节点属性值

    <html> <head> <title>AjaxTest</title> <script> var xmlHttp; function c ...

  10. JSON格式的服务接口

    电商接口 京东获取单个商品价格接口: http://p.3.cn/prices/mgets?skuIds=J_商品ID&type=1 用例 ps:商品ID这么获取:http://item.jd ...