最近做了一个项目,其中有个视频和图片需要添加各种水印(日期,地点,经纬度,用户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. JDBC连接数据库步骤及Class.forName()(转)

    JDBC连接数据库 JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java DataBase Connectivity,java数据库连接)是一种 ...

  2. ANDROID L——RecyclerView,CardView进口和使用(Demo)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 这篇文章是ANDROID L--Material Design具体解释(UI控 ...

  3. 数据库版本管理工具Flyway——基础篇

    Flyway 默认规约 SQL 脚本文件默认位置是项目的源文件夹下的db/migration 目录. Java 代码默认位于db.migration 包. SQL 脚本文件及Java 代码类名必须遵循 ...

  4. 【24.63%】【codefroces 686D】Kay and Snowflake

    time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standa ...

  5. Managing uniquely tagged items using the internet

    The invention teaches managing an item in the Internet of Things, wherein the system comprises: an i ...

  6. C-order/Fortran-order(Row-/Column-major order)

    1. row-major / column-major order 无论是行序优先还是列序优先,其实在计算机计算中,指的都是在线性空间(linear storage,如 RAM,也即连续内存存储 co ...

  7. springboot 配置多数据源 good

    1.首先在创建应用对象时引入autoConfig package com; import org.springframework.boot.SpringApplication; import org. ...

  8. 基于JUnit和Ant测试程序正在运行使用Kieker(AspectJ)监测方法

    这篇日志的目的从标题里能够看出来.这也是我们实验须要,必须总结一下,方便其它师弟师妹在这个基础上做实验. 我已经介绍了非常多基于Kieker的监控方法,这里以Prefuse这个开源可视化Java框架为 ...

  9. 2-5 利用RestTemplateCore简化调用Consul中的服务

    1.必须要安装RestTemplateCore包 2.请求服务,必须要知道 a Consul服务器的地址:b 请求的服务名 ;c 具体请求的api接口 利用RestTemplateCore简化调用Co ...

  10. ude—基于udp的全双工可靠传输协议

    ude是一款基于udp的可靠传输协议,专门用于在数据传输方面对实时性要求较高的应用领域.    tcp协议虽然能保证数据的可靠传输,但它有以下几个缺点:1.tcp的数据确认机制会导致发送方重复发送一些 ...