zoukankan      html  css  js  c++  java
  • Android UI中英文自动显示问题

    最近做了一个项目,其中有个视频和图片需要添加各种水印(日期,地点,经纬度,用户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
     
  • 相关阅读:
    POJ 1741 Tree(树分治)
    HDU 2196 Computer(树形dp)
    2015沈阳区域赛Meeting(最短路 + 建图)
    make the fence great again(dp 二维)
    2017沈阳区域赛Infinite Fraction Path(BFS + 剪枝)
    bitset详解
    2016青岛区域赛.Coding Contest(费用流 + 概率计算转换为加法计算)
    2019上海网络赛B题(差分 + 离散化 or 差分 + 思维)
    poj-1664.放苹果.(递推)
    hdu-4738.Caocao's Bridges(图中权值最小的桥)
  • 原文地址:https://www.cnblogs.com/wangqiang9/p/10400257.html
Copyright © 2011-2022 走看看