android自动显示金额UI,Android UI中英文自动显示问题

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

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

这是两种不一样的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下面, 以下图所示,其余的语言种类也诸如此类。

752ee0ef30ab2c45ca90c580186e6cf9.png

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

3. 手动显式的调用以下函数切换(本人还没有测试,仅供参考):spa

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();

}.net

}翻译

而后,调用它进行切换:设计

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

直接经过反射获取到系统设置语言那个类(LocalePicker),执行类里的updateLocale(Locale locale)这个方法传入语言设置更新系统语言。简单粗暴。

注意:须要权限

参见:

https://blog.csdn.net/xiaxiayige/article/details/45666359

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值