最近做了一个项目,其中有个视频和图片需要添加各种水印(日期,地点,经纬度,用户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. Gini 系数与熵的关系

    首先来看二者的基本定义: ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪H(X)=−∑k=1KpklnpkGini(X)=∑k=1Kpk(1−pk) 将 f(x)=−lnx 在 x=1 处进行一阶泰勒展开(忽略高阶无穷小 ...

  2. Spring4+Springmvc+quartz实现多线程动态定时调度

    scheduler定时调度系统是大多行业项目都需要的,传统的spring-job模式,个人感觉已经out了,因为存在很多的问题,特别是定时调度的追加.修改.删除等,需要修改xml,xml的配置生效无非 ...

  3. 源码分析之Dictionary笔记

    接下来我们一步步来熟悉 Dictionary的底层结构实现,下面的MyDictionary等同于源码中的Dictionary看待. 首先我们定义一个类 MyDictionary,类中定义一个结构Ent ...

  4. Linux下的正斜杠"/"和"\"的区别

    今天在检查root目录时发现有一个名为"\"的文件,觉得很奇怪,从来没见过,就准备用Vim打开看看,很自然地输入命令查看一下,结果居然打不开. [root@localhost ~] ...

  5. gridview分页

    protected void lnkbtnFrist_Click(object sender, EventArgs e) { //首页 ; this.ReadData(); } protected v ...

  6. VS2015如何自定义类模板、我的模板——原来这么简单!

    在前一段时间忽然想给自己电脑上的vs新建类的时候添加一个自定义个注释,但是在网上搜了很久都是说vs2012之类的方法系统也都是win7.XP之类的独独没有win8的.故此自己不断的尝试修改发现方法如下 ...

  7. yii2.0获取最后一条ID

    $r_id=Yii::$app->db->getLastInsertID();

  8. C#代码实现矢量画图

    原文:C#代码实现矢量画图 版权声明:本文为博主原创文章,转载请附上链接地址. https://blog.csdn.net/ld15102891672/article/details/80275969 ...

  9. WPF中实现图片文件转换成Visual对象,Viewport3D对象转换成图片

    原文:WPF中实现图片文件转换成Visual对象,Viewport3D对象转换成图片 1.图片文件转换成Visual对象 private Visual CreateVisual(string imag ...

  10. ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...